leetcode动态规划--基础题
跳跃游戏
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
思路
根据题目意思,最大跳跃距离,说明可以跳0--nums[i]的距离
可以把跳跃看成走nums[i]步,如果能走到下一位置则可以加油获取更多的步数(nums[j]步),但是不能累加
那么只需扫一遍nums数组,更新剩余能跳的距离(注意不能累加,只能取最大!)
到终点之前判断是否有剩余步骤即可
代码
class Solution {
public:
bool canJump(vector<int>& nums) {
if(nums.size()==0)return false;
int cur=nums[0];
for(int i=1;i<nums.size();++i){
if(cur<=0){
return false;
}
cur--;
cur=std::max(cur,nums[i]);
}
return true;
}
};
不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
思路
当前位置可以来自上方或者左边
令dp[i][j]表示第i行第j列的路径数,则dp[i][j]=dp[i-1][j]+dp[i][j-1];
注意边界即可
代码
class Solution {
public:
int uniquePaths(int m, int n) {
int path[m+1][n+1];
memset(path,0,sizeof(path));
path[0][1]=1;
for(int i=1;i<=m;++i){
for(int j=1;j<=n;++j){
path[i][j]=path[i-1][j]+path[i][j-1];
}
}
return path[m][n];
}
};
零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
思路
一开始想法是搜索,但是超时了(大概是我太菜了吧)
接着想到每一中硬币选的个数最多为amount / coins[i]
接着就是将其转化为0/1背包问题求解
dp[i][j]表示前i个硬币组成金额 j 的最少硬币个数
dp[i][j] = min(dp[i-1][j-k*coins[i]) , 0<=k<=j/coins[i];
代码
代码写的太丑了
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
if(coins.size()==0)return -1;
int cn=coins.size();
int dp[cn+1][amount+1];
for(int i=0;i<=cn;++i){
for(int j=0;j<=amount;++j){
dp[i][j]=-1;
}
}
for(int i=0;i<=cn;++i){
dp[i][0]=0;
}
// 第一个硬币
for(int i=1;i<=amount;++i){
if(i%coins[0]==0){
dp[0][i]=i/coins[0];
}
}
for(int i=1;i<cn;++i){
for(int j=0;j<=amount;++j){
// 第i枚硬币选择k个
for(int k=0;k*coins[i]<=j;++k){
if(dp[i-1][j-k*coins[i]]!=-1){
if(dp[i][j]==-1){
dp[i][j]=dp[i-1][j-k*coins[i]]+k;
}else{
dp[i][j]=min(dp[i][j],dp[i-1][j-k*coins[i]]+k);
}
}
}
}
}
return dp[cn-1][amount];
}
};
Longest Increasing Subsequence
最长上升子串
思路
令dp[i]表示以nums[i]作为结尾的最大上升子序列的最大长度
内层循环在前面找比nums[i]小的元素,可以将nums[i]接到j后面使得LIS长度加1
dp[i] = max(dp[j]+1) ,nums[i]>nums[j]&&0<=j<i;
注意最后返回dp的最大值
代码
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size()==0||nums.size()==1)return nums.size();
int dp[nums.size()];
for(int i=0;i<nums.size();++i){
dp[i]=1;
}
int ans=-1;
for(int i=0;i<nums.size();++i){
for(int j=0;j<i;++j){
if(nums[i]>nums[j]){
dp[i]=std::max(dp[i],dp[j]+1);
}
}
ans=std::max(ans,dp[i]);
}
return ans;
}
};
leetcode动态规划--基础题的更多相关文章
- nyist oj 79 拦截导弹 (动态规划基础题)
拦截导弹 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 某国为了防御敌国的导弹突击.发展中一种导弹拦截系统.可是这样的导弹拦截系统有一个缺陷:尽管它的第一发炮弹可以 ...
- LeetCode 94 | 基础题,如何不用递归中序遍历二叉树?
今天是LeetCode专题第60篇文章,我们一起来看的是LeetCode的94题,二叉树的中序遍历. 这道题的官方难度是Medium,点赞3304,反对只有140,通过率有63.2%,在Medium的 ...
- leetcode 动态规划类型题
1,Triangle int mininumTotal(vector<vector<int>>& triangle) { ; i >= ; --i) { ; j ...
- LeetCode 第70题动态规划算法
导言 看了 动态规划(https://www.cnblogs.com/fivestudy/p/11855853.html)的帖子,觉得写的很好,记录下来. 动态规划问题一直是算法面试当中的重点和难点, ...
- 快速上手leetcode动态规划题
快速上手leetcode动态规划题 我现在是初学的状态,在此来记录我的刷题过程,便于以后复习巩固. 我leetcode从动态规划开始刷,语言用的java. 一.了解动态规划 我上网查了一下动态规划,了 ...
- [LeetCode] 系统刷题5_Dynamic Programming
Dynamic Programming 实际上是[LeetCode] 系统刷题4_Binary Tree & Divide and Conquer的基础上,加上记忆化的过程.就是说,如果这个题 ...
- leetcode top-100-liked-questions刷题总结
一.起因 宅在家中,不知该做点什么.没有很好的想法,自己一直想提升技能,语言基础自不必言,数据结构还算熟悉,算法能力一般.于是乎,就去刷一通题. 刷题平台有很多,我选择了在leetcode进行刷题.回 ...
- leetcode 第188题,我的解法,Best Time to Buy and Sell Stock IV
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
- leetcode第37题--Count and Say
题目:(据说是facebook的面试题哦) The count-and-say sequence is the sequence of integers beginning as follows:1, ...
随机推荐
- (全国多校重现赛一)F-Senior Pan
Senior Pan fails in his discrete math exam again. So he asks Master ZKC to give him graph theory pro ...
- linux需要了解的网络基础知识
第1章 网络命令 1.1 用户模式下的命令 1.1.1 enable切换到特权模式 Router>enable Router# 特权模式 Router# Router# 1.2 特权模式下的命令 ...
- Ceph分布式存储-总
Ceph分布式存储-总 目录: Ceph基本组成及原理 Ceph之块存储 Ceph之文件存储 Ceph之对象存储 Ceph之实际应用 Ceph之总结 一.Ceph基本组成及原理 1.块存储.文件存储. ...
- 分布式监控告警平台Centreon快速使用
一. Centreon概述 Centreon是一款功能强大的分布式IT监控系统,它通过第三方组件可以实现对网络.操作系统和应用程序的监控:首先,它是开源的,我们可以免费使用它:其次,它的底层采用nag ...
- 怎么样才算是精通 Python?
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:weixin_45587093 你们所说的什么要怎样数据分析.爬虫.We ...
- kerberos&ssh 原理、免密登录搭建
原理 详细介绍 参考oracle文档:Kerberos 服务 安装过程 1.安装krb5 yum install -y krb5-server yum install krb5-workstation ...
- Elasticsearch系列---搜索分页和deep paging问题
概要 本篇从介绍搜索分页为起点,简单阐述分页式数据搜索与原有集中式数据搜索思维方式的差异,就分页问题对deep paging问题的现象进行分析,最后介绍分页式系统top N的案例. 搜索分页语法 El ...
- 手把手教你看懂并理解Arduino PID控制库——引子
介绍 本文主要依托于Brett Beauregard大神针对Arduino平台撰写的PID控制库Arduino PID Library及其对应的帮助博客Improving the Beginner’s ...
- 更新Preloader和uboot
在SoCEDS环境下编译和更新preloader和uboot程序的方法 前面有介绍preloader在HPS boot过程中的的作用,接下来讲述下用户在SoCEDS环境下改如何编译preloade ...
- python连接sqlserver和MySQL实现增删改查
参考python核心编程 编写一个用户洗牌的脚本,根据用户输入,选择连接sqlserver或者MySQL,创建数据库.表,随机生成数据,并实现增删改查. 其中,为了兼容python2和python3, ...