力扣198.打家劫舍---动态规划与滚动数组
力扣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 。
提示:
0 <= nums.length <= 100
0 <= nums[i] <= 400
法一:纯动态规划
假如只有一个房子,那我们偷第一个即为最大金额
假如有两个房子,我们只需要在两个中找一个最大的即可
假如有三个房子,此时需要注意:我们要分成两种状态,即:
1.偷第三个房子
如果偷第三个,那么第二个一定不能偷,即偷第三个的前两个,即第一个
2.不偷第三个房子
如果不偷第三个房子,那么最大金额即为前两个的最大金额
所以可以类推,当有n个房子时,
分为两种情况:
1.偷第n个
那么此时总的最大金额应为第n个房子的金额加上偷前面n-2个的房子的最大金额
2.不偷第n个
那么此时总最大金额应为偷前面第n-1个房子的最大金额
所以依次可当成数列列出递推公式:
令i=n-1
a[i]=max(a[i-1],a[i-2]+nums[i])
列出动态方程即可。
int max(int x,int y)
{int z;z=x>y?x:y;return z;
}
int rob(int* nums, int numsSize){if(numsSize==1)
return nums[0];
if(numsSize==0)
return 0;
if(numsSize==2)
return max(nums[0],nums[1]);
int a[100];//这里专门列出一个储存总金额的方程
a[0]=nums[0];
a[1]=max(nums[0],nums[1]);//先初始化一下
for(int i=2;i<numsSize;i++)
{a[i]=max(a[i-1],a[i-2]+nums[i]);
}
return a[numsSize-1];//最后只要一个结果
}
法二:动态规划加滚动数组
由于上述法一白白的制造了一个数组a,而实际上我们只需要这个数组的最后一个数就行了,所以我们可以不单独制造数组,只要找准两个状态,让这两个状态不断更新即可。
int max(int x,int y)
{int z;z=x>y?x:y;return z;
}
int rob(int* nums, int numsSize){if(numsSize==1)
return nums[0];
if(numsSize==0)
return 0;
if(numsSize==2)
return max(nums[0],nums[1]);
int _new;//此为后一个的状态
int old;//此为前一个的状态
int temp;//临时变量
_new=max(nums[0],nums[1]);
old=nums[0];
for(int i=2;i<numsSize;i++)
{temp=_new;_new=max(_new,old+nums[i]);old=temp;
}
return _new;
}
力扣198.打家劫舍---动态规划与滚动数组相关推荐
- 力扣 三步问题动态规划加滚动数组
面试题 08.01. 三步问题 三步问题.有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶.2阶或3阶.实现一种方法,计算小孩有多少种上楼梯的方式.结果可能很大,你需要对结果模100000000 ...
- 力扣209-长度最小的子数组(Java,双指针解法)
209. 长度最小的子数组 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/minimum-size-subarray ...
- (力扣C++)动态规划学习计划
509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,F(1) = 1 ...
- 力扣453.最小操作次数使数组元素相等
题目描述 给定一个长度为 n 的 非空 整数数组,每次操作将会使 n - 1 个元素增加 1.找出让数组所有元素相等的最小操作次数. 示例 输入: [1,2,3] 输出: 3 解释 只需要3次操作(注 ...
- 力扣解法汇总954-二倍数对数组
目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描 ...
- 力扣209. 长度最小的子数组
题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target .找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, ...
- 力扣算法篇:1480. 一维数组的动态和
1480. 一维数组的动态和 给你一个数组 nums .数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]-nums[i]) . 请返回 nums 的动态和. 示例 1 ...
- 力扣88 - 合并两个有序数组【归并排序思维】
九九归一 一.题目描述 二.思路分析 三.整体代码展示 四.代码详解[步步算法图解] 情况一:nums2遍历完,nums1无需动 情况二:nums1遍历完,nums2还有剩余元素[特殊] 五.总结与提 ...
- 力扣记录:动态规划4股票问题——121,122,123,188 ,309,714买卖股票的最佳时机(I,II,III,IV,含冷冻期,含手续费)
本次题目 121 买卖股票的最佳时机(只能买卖一次) 122 买卖股票的最佳时机II(可以买卖多次) 123 买卖股票的最佳时机III(最多买卖两次) 188 买卖股票的最佳时机IV(最多买卖k次) ...
最新文章
- 以太坊今日大涨7.5%,芝商所备战“以太坊期货”
- 融云任杰:强互动,RTC 下一个“爆点”场景 | 拟合
- knn聚类还是分类_数据分析基本算法模型之KNN算法
- 函数式编程语言时代已经来临
- 把blogengine当作cms作公司网站
- Windows azure国际版下通过 windows auzre powershell为VM分配绑定virtual ip address
- Containerpilot 配置文件reload
- dom 生成图片和链接生成二维码
- response.getWriter()和jsp中out对象的区别
- LeetCode 1568. 使陆地分离的最少天数(DFS)
- python博客项目评论_Python 爬虫入门——小项目实战(自动私信博客园某篇博客下的评论人,随机发送一条笑话,完整代码在博文最后)...
- 成也炒作,败也炒作?孙宇晨遭遇最大信任危机
- (转载)正则表达式30分钟入门教程
- 37. 反转一个3位整数 Java
- apktool+dex2jar+xjad反编译android程序
- 测试笔记本续航的软件,【教程向】如果给笔记本降温及延长续航
- Xshell远程连接配置 Ubuntu 18.04.6 + Anaconda + CUDA + Cudnn + Pytorch(GPU+CPU)
- 极速办公(ppt)如何插入超链接
- 域名、dns、服务器、IP、主机名(写的好)
- 【个人代码及思路】2018年9月CSP第一题:卖菜
热门文章
- php word 邮件合并发送邮件,WPS 邮件合并 30秒批量制作Word文档 Excel数据批量导入World指定位置...
- Python 生成临时文件和目录 -tempfile
- 用Keras实现SDAE
- 一位ACMer过来人的心得
- 关于战网BLZBNTBTS0000005D的解决方法
- c语言怎么把两个数组连接到一起,连接两个数组的方法
- 学会这项python技能,就再也不怕孩子偷偷打游戏了
- 盛世三国未能连接到服务器,《盛世三国》停服公告
- Flex移动皮肤开发(三)
- 逗女友开心的笑话短信:我出生的概率是二千五百亿分之一...