198. 打家劫舍
难度简单
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
示例 1:
输入: [1,2,3,1] 输出: 4 解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:
输入: [2,7,9,3,1] 输出: 12 解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。 偷窃到的最高金额 = 2 + 9 + 1 = 12 。
思路:对于该题,我那为数不多的知识储量告诉我,将所有可能发生的情况全部列举出来,然后选取最大值,这样做的话,时间复杂度,空间复杂度都是十分庞大的。所以,淘了一顿评论区,淘到了一个宝贝,在这里立个flag,https://mp.weixin.qq.com/s/3h9iqU4rdH3EIy5m6AzXsg
这道题,可以使用动态规划来解决,刚才的flag也是有关动态规划的介绍,在对动态规划进行了了一波学习之后,虽然只掌握了皮毛,但还算顺利的解决了问题,代码如下:
1 int max(int a,int b){ 2 if(a>b){ 3 return a; 4 }else{ 5 return b; 6 } 7 } 8 int rob(int* nums, int numsSize){ 9 if(nums==NULL||numsSize==0){ 10 return 0; 11 } 12 if(numsSize==1){ 13 return nums[0]; 14 } 15 int i; 16 int* dp; 17 dp=(int *)malloc(numsSize*sizeof(int)); 18 dp[0]=nums[0]; 19 dp[1]=max(nums[1],nums[0]); 20 for(i=2;i<numsSize;i++){ 21 dp[i]=max(dp[i-2]+nums[i],dp[i-1]); 22 } 23 return dp[numsSize-1]; 24 }