leetcode动态规划刷题总结1

1-最长回文子串
题目链接:题目链接戳这里!!!

测试了好几次才通过,AC代码如下。
第一次用的暴力枚举,双指针判断回文,超时。
第二次我以为将字符串翻转,和原字符串对比求最长公共子串就可以,其实不是,通过177个测试用例,3个通不过。
第三次,用的动态规划,accept,递推表达式如下:
dp[i][j]=true;
dp[i][j] = dp[i+1][j-1];
就是从i到i的串,也就是单个,一定是回文。
否则,判断左侧i位置的字符是否与右侧j位置的字符相同,若不同,必然不是回文串,若相同,j-i<3,则不超过三个字符,必为回文串,若j-i>=3,则dp[i][j] = dp[i+1][j-1]

public class Solution {public static String longestPalindrome(String s) {int len = s.length() ;if(len==1){return s ;}int max = 1, index=0 ;boolean [][]dp = new boolean [len][len] ;for(int i=0; i<len; i++){dp[i][i] = true ;}for(int L=2; L<=len; L++){for(int i=0; i<len; i++){int j = L + i - 1  ;if(j>=len){break ;}if(s.charAt(i) != s.charAt(j)){dp[i][j] = false ;}else{if(j-i<3){dp[i][j] = true ;}else{dp[i][j] = dp[i+1][j-1] ;}}if(dp[i][j] && j-i+1>max){max = j - i + 1;index = i ;}}}return s.substring(index, index+max) ;}
}

2-括号生成
题目链接:题目链接戳这里!!!
这题用dfs也能AC,搜索根据左右括号剩余数量,添加左括号和右括号,直至剩余个数为0。

class Solution {List<String> list = new ArrayList<>() ;public List<String> generateParenthesis(int n) {dfs(n,n, "") ;return list ;}public  void dfs(int left, int right, String str){if(left==0 && right==0){list.add(str) ;return ;}if(left>0){dfs(left-1, right, str+ "(") ;}if(right>left){dfs(left, right-1, str+ ")") ;}}
}

动态规划AC代码如下:
递推思想:
“(” + i=p时所有括号的排列组合 +")" + i=q时所有括号的排列组合

import java.util.LinkedList;
import java.util.List;class Solution {public List<String> generateParenthesis(int n) {LinkedList <LinkedList<String>> result = new LinkedList<>() ;LinkedList<String> list1 = new LinkedList<>() ;list1.add("") ;LinkedList<String> list2 = new LinkedList<>() ;list2.add("()") ;result.add(list1) ;result.add(list2) ;for(int i=2; i<=n; i++){LinkedList<String> temp = new LinkedList<>() ;for(int j=0; j<i; j++){LinkedList<String> str1 = result.get(j) ;LinkedList<String> str2 = result.get(i-j-1) ;for(String s1 : str1){for(String s2 : str2){String res = "(" + s1 + ")" + s2 ;temp.add(res) ;}}}result.add(temp) ;}return result.get(n) ;
}
}

3-爬楼梯
题目链接:题目链接戳这里!!!

水个题,放松一下,AC代码如下:
思想:这题递归也可以做,不过会超时,用简单的递推公式可以,当大于等于3阶楼梯,f[i] = f[i-1] + f[i-2] ,当一阶楼梯f[1]=1,两阶楼梯f[2]=2;

class Solution {public int climbStairs(int n) {int [] f = new int [n+1] ;if(n==1){return 1 ;}if(n == 2){return 2 ;}f[1] = 1 ;f[2] = 2 ;for(int i=3; i<=n; i++){f[i] = f[i-1] + f[i-2] ;}return f[n] ;}
}

4-丑数
题目链接:戳这里!!!
三指针法,AC代码如下:
最初三个指针都指向最初位置,依次选择三个指针所在值,乘2,3,5的最小值,依次加入到list中。

import java.util.List ;
class Solution {public int nthUglyNumber(int n) {int ans = 1 ;if(n==1){return 1 ;}List<Integer> list = new ArrayList<>() ;list.add(1) ;int idx2 = 0 ;int idx3 = 0 ; int idx5 = 0 ;for(int i=0; i<n-1; i++){int a = list.get(idx2)*2 ;int b = list.get(idx3)*3 ;int c = list.get(idx5)*5 ;int min = Math.min(Math.min(a,b),c) ;list.add(min) ;if(list.get(list.size()-1) == a){idx2 ++ ;}if(list.get(list.size()-1) == b){idx3 ++ ;}if(list.get(list.size()-1) == c){idx5 ++ ;}}return list.get(list.size()-1) ;}
}

这样写,更简洁,AC代码如下:

class Solution {public int nthUglyNumber(int n) {int idx2=0, idx3=0, idx5=0;int [] dp = new int [n] ;dp[0] = 1 ;for(int i=1; i<n; i++){dp[i] = Math.min(2*dp[idx2],Math.min(3*dp[idx3], 5*dp[idx5])) ;if(dp[i] == 2 * dp[idx2]){idx2++ ;}if(dp[i] == 3 * dp[idx3]){idx3 ++ ;}if(dp[i] == 5 * dp[idx5]){idx5 ++ ;}}return dp[n-1] ;}
}

5-杨辉三角
题目链接:题目 链接戳这里!!!
很简单的动态规划,dp[][]的第一行,第一列,最后一列都是1,其余的满足d[i][j] = dp[i-1][j-1]+dp[i-1][j]
AC代码如下:

class Solution {public List<List<Integer>> generate(int numRows) {int [][] dp = new int [numRows][numRows] ;List<List<Integer>> res = new ArrayList<>() ;for(int i=0; i<numRows; i++){List<Integer> list = new ArrayList<>() ;for(int j=0; j<=i; j++){if(i==0 || j==0 || i==j){dp[i][j] = 1 ;list.add(dp[i][j]) ;}else{dp[i][j] = dp[i-1][j-1] + dp[i-1][j] ;list.add(dp[i][j]) ;}}res.add(list) ;}return res ;}
}

6-杨辉三角||
题目链接如下:题目链接戳这里!!!
这题和上一题的杨辉三角类似,不再赘述,直接上AC代码

class Solution {public List<Integer> getRow(int rowIndex) {List<Integer> list = new ArrayList<>() ;int [][]dp = new int [rowIndex+1][rowIndex+1] ;for(int i=0; i<=rowIndex; i++){for(int j=0; j<=i; j++){if(i==0 || j==0 || i==j){dp[i][j] = 1 ;}else{dp[i][j] = dp[i-1][j-1] + dp[i-1][j] ;}if(i==rowIndex){list.add(dp[i][j]) ;}}}return  list ;}
}

7-最大子数组和
题目链接:题目链接戳这里!!!
这题和最长递增子序列不同,子数组是连续,而子序列不要求连续,每次判断当前的数组值是否大于0,大于0则加到下一个数组上,找到最终数组中的最大值即可。AC代码如下:

class Solution {public int maxSubArray(int[] nums) {int max = nums[0] ;for(int i=0; i<nums.length-1; i++){if(nums[i]>0){nums[i+1] += nums[i] ;}if(nums[i+1] > max){max = nums[i+1] ;}}return max ;}
}

8-最长递增子序列
递推表达式: dp[i] = Math.max(dp[j]+1, dp[i])
先把dp数组全部填充1,初始化为递增子序列为本身,后面固定i,依次从头遍历j,如果nums[i]>nums[j],则dp[i]变为Math.max(dp[j]+1, dp[i]) ,最后扫描dp数组,找出最大值,就是最长递增子序列的长度。
复杂度O(N^2)
AC代码如下:

class Solution {public int lengthOfLIS(int[] nums) {int [] dp = new int [nums.length] ;int res = Integer.MIN_VALUE ;Arrays.fill(dp, 1) ;for(int i=1; i<nums.length; i++){for(int j=0; j<i; j++){if(nums[i] > nums[j]){dp[i] = Math.max(dp[j]+1, dp[i]) ;}}}for(int i=0; i<dp.length; i++){res = Math.max(dp[i], res) ;}return res ;}
}

9-完全平方数
题目链接:题目链接戳这里!!!
找到递推公式,就简单了,否则,就很难,这题,用dp数组记录使用的最少的完全平方数,实际上就是背包问题。

思路:dp[n]:表示数字n能由最少由多少个完全平方数求和得到
n是否由n-jj 和 jj凑出
由其凑出:dp[i] = dp[i-j*j]+1
不由其凑出:dp[i] = dp[i]

AC代码如下:

class Solution {public int numSquares(int n) {int [] dp = new int [n+1] ;Arrays.fill(dp, Integer.MAX_VALUE) ;dp[0] = 0 ;for(int i=1; i<=n; i++){for(int j=1; j*j<=i; j++){dp[i] = Math.min(dp[i], dp[i-j*j]+1) ;}}return dp[n] ;}
}

10-零钱兑换
题目链接:题目链接戳这里!!!
这题和完全平方数一样,是一个背包问题,AC代码如下:
思路如下:
dp[amount]:表示凑出总金额amount所需的最少硬币数
我们考虑的amount是否由amount-coins凑出,分为凑和不凑两种情况
1-凑:dp[amount] = dp[amount-coins] + 1
2-不凑:dp[amount] = dp[amount]
我们选取二者的最小者即可

class Solution {public int coinChange(int[] coins, int amount) {int [] dp = new int [amount + 1] ; Arrays.fill(dp, Integer.MAX_VALUE) ;dp[0] = 0 ;for(int i=1; i<=amount; i++){for(int j=0; j<coins.length; j++){if((i-coins[j]>=0) && (dp[i-coins[j]] != Integer.MAX_VALUE)){dp[i] = Math.min(dp[i], dp[i-coins[j]]+1) ;}}}if(dp[amount] == Integer.MAX_VALUE){return -1 ;}return dp[amount] ; }
}

leetcode之动态规划刷题总结1(Java)相关推荐

  1. 剑指offer刷题记录 python3 Java

    剑指offer刷题记录 python3 Java 剑指 Offer 09. 用两个栈实现队列 剑指 Offer 10- I. 斐波那契数列 剑指 Offer 03. 数组中重复的数字 [★]剑指 Of ...

  2. 2022-12-16 leetcode与蓝桥刷题情况

    一.leetcode题目 1.构成特定和需要添加的最少元素 题目描述 给你一个整数数组 nums ,和两个整数 limit 与 goal .数组 nums 有一条重要属性:abs(nums[i]) & ...

  3. 力扣刷题pdf(java版本,内含暗黑版和光明版),都在这里了

    BAT大佬力扣刷题pdf,都在这里了! ​相信很多小伙伴刷题的时候面对力扣上近两千道题目,感觉无从下手! 我找了很久,今天终于让找到了Java版leetcode算法题解笔记,强烈建议先按照本篇介绍pd ...

  4. 【刷题记录①】Java从0到1入门|基础知识巩固练习

    JAVA从0到1入门刷题记录 目录 一.类型转换 二.简单运算 三.四舍五入 四.交换变量值 五.计算商场折扣 六.判断体重指数 总结 我几乎每天都会刷题训练来使自己对各种算法随时保持一个清晰的状态. ...

  5. LeetCode按知识点刷题,额外附带题解

    刷题顺序转自:ACM金牌选手整理的[LeetCode刷题顺序]_清澈不在远方-CSDN博客 题解为本人自刷 数据结构 数组&双指针 LeetCode 1. 两数之和 /*** 给定一个整数数组 ...

  6. Leetcode每日必刷题库第80题,如何在不使用外部空间的情况下对有序数组去重?

    LeetCode的第80题,有序数组去重II(Remove Duplicates from Sorted Array II). 这题的官方难度是Medium,通过率是43.3%,点赞1104,反对69 ...

  7. 力扣(LeetCode)打卡刷题交流计划(长期维护)

    前言 忙忙活活暑期过去了一半,在即将升学的日子里,打算干点什么东西,由于实力以及经验的欠缺没有创群和大家讨论,但我更喜欢以更实在的方式--能作点什么--和大家一起从0打开力扣LeetCode, 对,没 ...

  8. leetcode 高薪_LeetCode刷题实战69:x 的平方根

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  9. Leetcode按Tag刷题

    按照Leetcode的Tag来刷题,从easy到hard刷题 关于如何让Leetcode按难易程度排序,可按以下步骤: 1. 进入Leetcode后,点击code 2.点击code后,可查看所有题目, ...

  10. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

最新文章

  1. 【第二篇】Volley的使用之加载图片
  2. 爬虫基础-登陆github获取个人信息
  3. 类和对象—对象特性—const修饰成员函数
  4. win10 hyper-v 虚拟机ping不通宿主机问题
  5. POJ 3613 Cow Relays (floyd + 矩阵高速幂)
  6. 吴恩达深度学习2.3练习_Improving Deep Neural Networks_Tensorflow
  7. Java编程思想精彩评注分享之一
  8. Debian更新软件源提示There is no public key available for the following key IDs的解决方法
  9. 《设计模式》组合模式---伊利工厂
  10. 分布式本质论:高吞吐、高可用、可扩展 (1)
  11. 基于单片机的人体心率脉搏检测系统
  12. 关于使用TP-Link桥接小米路由器
  13. react后台管理项目
  14. 11讲项目实战首页右侧悬浮框及内页面包屑导航
  15. Easy Mock全解及使用
  16. JavaScript三种弹出框(alert、confirm、prompt),一次性全弄清!
  17. 【c++STL——第四讲】stack系列 (常用知识点总结)
  18. 现货交易、远期合同交易和期货交易
  19. uni 页面加载完毕_uniapp小程序如何等待数据回来才加载页面?
  20. 局域网设置共享文件夹及常见问题解决办法

热门文章

  1. Oracle中的sys用户和system用户
  2. 为什么Multi-DRM如此重要?
  3. 笔记本设置wifi热点并抓包
  4. 远程桌面 vs 虚拟桌面 vs 虚拟机区别
  5. 产业AI公司的简单调研
  6. MES系统的工艺管理与绩效管理
  7. 面包屑导航html页面,react怎么实现面包屑导航
  8. 找回任务栏显示桌面图标及Win7如何显示快速启动栏
  9. windows下快速安装nginx并配置开机自启动的方法
  10. 2022 华东师范大学 数据学院复试机考