监控视频做直播网站,网站建设198,58临沂网站建设,做ppt素材的网站题1#xff1a;
指路#xff1a;198. 打家劫舍 - 力扣#xff08;LeetCode#xff09;
思路与代码#xff1a;
对于这个题#xff0c;拿房屋i举例#xff0c;我们需要考虑的是否确定偷取这个房屋#xff0c;如果确定偷取这个房屋#xff0c;那么我们将得到房屋i的金…题1
指路198. 打家劫舍 - 力扣LeetCode
思路与代码
对于这个题拿房屋i举例我们需要考虑的是否确定偷取这个房屋如果确定偷取这个房屋那么我们将得到房屋i的金币也就是nums[i]但是因为不能偷取相邻的房屋那么得到nums[i]和前i-2个房屋最大金币数的同时失去的是nums[i-1]否则不偷取这个房屋那么考虑偷取的就是第i-1个房屋。这里我们就需要判断这两种情况那种得到的金币最多。特殊情况当房屋门下标是0时此时一定会偷取这仅有的一间那么此时金币数为nums[0]当房屋下标为1时我们需要判断第0间房屋和第1间房屋的较大值得到较大的金币数。首先定义一个数组dp[i]其含义为考虑下标为i在内(包括i)的房屋之前能够偷得的最大的金币数其次我们尝试得出递推公式前面分析题意阶段已经有提到过dp[i]应该取确定偷取第i间房屋和确定不偷取第i间房屋的较大值也就是dp[i]max(nums[i] dp[i - 2], dp[i - 1])然后对dp数组进行初始化我们在前面也提到过即dp[0]nums[0]dp[1]max(nums[0], nums[1])接着我们确定遍历顺序这个题的遍历顺序显而易见从小到大即可也就是从下标为2到nums.size()最后打印dp数组即可。代码如下
class Solution {
public:int rob(vectorint nums) {if (nums.size() 0) return 0;if (nums.size() 1) return nums[0];vectorint dp(nums.size());dp[0] nums[0];dp[1] max(nums[0], nums[1]);for (int i 2; i nums.size(); i) {dp[i] max(dp[i - 2] nums[i], dp[i - 1]);}return dp[nums.size() - 1];}
};
题2
指路213. 打家劫舍 II - 力扣LeetCode
思路与代码
对于这个打家劫舍不同于上一个的是它的环形形态抽象来说也就是首尾房屋不能同时偷取这样我们尝试分类讨论考虑偷取首房屋和考虑偷取尾房屋。那么中间不带首尾房屋的情况就是我们上一题的打家劫舍。在public中讨论考虑两种偷取方式的结果取较大值即可。代码如下
class Solution {
public:int rob(vectorint nums) {if (nums.size() 0) return 0;if (nums.size() 1) return nums[0];int result1 robRange(nums, 0, nums.size() - 2); //考虑左边界int result2 robRange(nums, 1, nums.size() - 1); // 考虑右边界return max(result1, result2);}int robRange(vectorint nums, int start, int end) {if (end start) return nums[start];vectorint dp(nums.size());dp[start] nums[start];dp[start 1] max(nums[start], nums[start 1]);for (int i start 2; i end; i) {dp[i] max(dp[i - 2] nums[i], dp[i - 1]);}return dp[end];}
};