leetcode上的一些动态规划
70-爬楼梯
思路:该问题可以理解为经典的“斐波那契数列”问题,但这里需要用动规实现,递归会超时
class Solution {
public:
int climbStairs(int n) {
vector<int> memo(n+1,-1); memo[0]=memo[1]=1;
for (int i=2;i<=n;i++)
memo[i]=memo[i-1]+memo[i-2];
return memo[n];
}
};
120-三角形最小路径和
思路:可以考虑从三角形的最后一行作为更新的数组,然后逐步向上遍历出最小的元素放在第一位,第一位即为所求。
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
vector<int> dp(triangle.back());
for(int i=triangle.size()-2;i>=0;i--){
for(int j=0;j<=i;j++){
dp[j]=min(dp[j],dp[j+1])+triangle[i][j];
}
}
return dp[0];
}
};
64-最小路径和
思路:基础动规,比较上面[i-1][j]和左边[i][j-1]的大小,然后当前值相加最小值,求和
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
if(grid.empty()||grid[0].empty()) return 0; for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[0].size();j++){
if(i==0&&j==0) continue;
if(i==0) grid[0][j]+=grid[0][j-1];
else if(j==0) grid[i][0]+=grid[i-1][0];
else grid[i][j]+=min(grid[i-1][j],grid[i][j-1]);
}
}
return grid.back().back();
}
};
343-整数拆分
思路:用一个一维数组存储拆分后的乘积,动态规划遍历拆分的2个数的最大乘积。
279-完全平方数
思路:动规过程中,dp的下标i从0循环到n,j从1循环到 i+j*j <= n 的位置,然后每次更新 dp[i+j*j] 的值,动态更新 dp 数组
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1,INT_MAX);
dp[0]=0;
for(int i=0;i<=n;i++){
for(int j=1;i+j*j<=n;j++){
dp[i+j*j]=min(dp[i+j*j],dp[i]+1);
}
}
return dp.back();
}
};
91-解码方法
思路:在遍历过程中判断先判断每个数字是否为0,若是则将dp[i]赋为0,否则赋上dp[i-1]的值。然后观看数组是否存在。如果存在且满足前一位是1,或者和当前位一起组成的两位数不大于26,则当前dp[i]的值加上dp[i-2]的值。最终返回dp数组的最后一个值即可。
class Solution {
public:
int numDecodings(string s) {
if (s.empty() || s[0] == '0') return 0;
vector<int> dp(s.size() + 1, 0);
dp[0] = 1;
for (int i = 1; i < dp.size(); ++i) {
dp[i] = (s[i - 1] == '0') ? 0 : dp[i - 1];
if (i > 1 && (s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] <= '6'))) {
dp[i] += dp[i - 2];
}
}
return dp.back();
}
};
leetcode上的一些动态规划的更多相关文章
- LeetCode探索初级算法 - 动态规划
LeetCode探索初级算法 - 动态规划 今天在LeetCode上做了几个简单的动态规划的题目,也算是对动态规划有个基本的了解了.现在对动态规划这个算法做一个简单的总结. 什么是动态规划 动态规划英 ...
- LeetCode 62,从动态规划想到更好的解法
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第36篇文章,我们一起来看下LeetCode的62题,Unique Paths. 题意 其实这是一道老掉牙的题目了 ...
- LeetCode刷题总结-动态规划篇
本文总结LeetCode上有动态规划的算法题,推荐刷题总数为54道.具体考点分析如下图: 1.中心扩展法 题号:132. 分割回文串 II,难度困难 2.背包问题 题号:140. 单词拆分 II,难度 ...
- 关于Leetcode上二叉树的算法总结
二叉树,结构很简单,只是比单链表复杂了那么一丢丢而已.我们先来看看它们结点上的差异: /* 单链表的结构 */ struct SingleList{ int element; struct Singl ...
- 70. Climbing Stairs【leetcode】递归,动态规划,java,算法
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- 关于LeetCode上链表题目的一些trick
最近在刷leetcode上关于链表的一些高频题,在写代码的过程中总结了链表的一些解题技巧和常见题型. 结点的删除 指定链表中的某个结点,将其从链表中删除. 由于在链表中删除某个结点需要找到该结点的前一 ...
- 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略
原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...
- leetcode刷题-- 5. 动态规划
动态规划思路 参考 状态转移方程: 明确「状态」-> 定义dp数组/函数的含义 -> 明确「选择」-> 明确 base case 试题 53最大子序和 题目描述 53 给定一个整数数 ...
- [leetcode] 题型整理之动态规划
动态规划属于技巧性比较强的题目,如果看到过原题的话,对解题很有帮助 55. Jump Game Given an array of non-negative integers, you are ini ...
随机推荐
- js中的$符
js中的$代表什么意思呢? 首先js的作用是什么呢?是修饰网页动态内容的.那么修饰就需要定位主题,比如你把html比喻一个美女,让她唱一首歌.那么首先你要定位出是你想让哪个美女唱歌,通常我们用id来定 ...
- 阿里云二级域名解析指向服务器另一台主机— —Nginx
这是在一台阿里云服务器没有任何域名,但是配置高,因此想借用另一台阿里云服务器(配置较低)已备案的域名 跳转到这台配置高的服务器,那么使用nginx反向代理 server { listen 80; se ...
- 大数据学习笔记之Hadoop(二):HDFS文件系统
文章目录 一 HDFS概念 1.1 概念 1.2 组成 1.3 HDFS 文件块大小 二 HFDS命令行操作 三 HDFS客户端操作 3.1 eclipse环境准备 3.1.1 jar包准备 3.2 ...
- Android深度探索-卷1第四章心得体会
这一章的和三章的git用法有联系,so,吧上一章的git基本用法搞好了再来,具体的方法就是看书上网查,这里就不做详细步骤介绍了.这章就有点意思了,是源码的下载和编译,有能看的,能自己鼓捣的,本章介绍的 ...
- ubuntu 去除开机背景
sudo apt remove plymouth sudo sed -i 's/ splash//g' /etc/default/grub sudo update-grub
- selenium报错TypeError: 'FirefoxWebElement' object is not iterable
报错原因element少了s定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多了一个s表示复数. 改为 返回结果为
- 基于第二次数独游戏,添加GUI界面
高级软件工程第三次作业:基于第二次数独游戏,添加GUI界面.GUI界面代码如下: package firstGui; import java.awt.*; import java.awt.event. ...
- java异常不匹配问题
java的异常处理是为了提高程序健壮性的. 当发生异常的时候,我们把这个异常捕获到,或者throw出去.然后对这些异常的情况进行处理.并且异常发生之后的代码仍然会执行,这样就能提高程序的健壮性.如下 ...
- Autofac基本使用
原文:Autofac基本使用 AutoFac是.net平台下的IOC容器产品,它可以管理类之间的复杂的依赖关系.在使用方面主要是register和resolve两类操作. 这篇文章用单元测试的形式列举 ...
- C#设计模式:模板方法模式(Template Method)
一,我们为什么需要模板设计模式? 在程序设计中,可能每个对象都有共同的地方,而此时如果每个对象定义一次,如下例子,每个对象都写Stay()方法,这样在每个类中都有很多相同的代码,此时,我们需要用到模板 ...