
动态规划
蛋卷在月球烤面包
这个作者很懒,什么都没留下…
展开
-
力扣120 三角形最小路径和
思路:首先尝试用自顶向下的方法求dp结果,但是从上到下每个list的长度从小到大,所以需要考虑边界值,比较麻烦,所以从下往上遍历。原创 2022-08-04 13:08:25 · 147 阅读 · 0 评论 -
力扣329 矩阵中的最长递增路径
思路先创建dp数组,dp[i][j]表示以matrix[i][j]为结尾的最长路径,将所有点放入list中进行排序,然后遍历list中的每个节点,访问当前节点的上下左右并比较大小得到最终值。,将matrix的每个数都作为路径的起点进行深度优先遍历,每访问一个起点,计算以它的上下左右为起点的最长路径是多少,取四个值中的最大值加一,得到当前数做起点的最大路径长度。思路遍历二维数组,首先检查下标是否正确,其次设置了pre的值,用于存储上一个结点的值,visited数组中,方法一dfs(效率更高)...原创 2022-08-01 17:17:08 · 221 阅读 · 0 评论 -
力扣3 无重复字符的最长子串
方法一:滑动窗口参考:滑动窗口问题合集方法二:动态规划 public int lengthOfLongestSubstring(String s){ HashMap<Character,Integer> map=new HashMap<>(); int[] dp=new int[s.length()+1]; dp[0]=0; int maxLen=0; for(int i=1;i<原创 2022-04-08 16:29:25 · 200 阅读 · 0 评论 -
字节高频题补充 圆环回原点问题
圆环上有n个点,编号为0~n-1。从0点出发,每次可以逆时针和顺时针走一步,问走n步回到0点共有多少种走法。public int GetSteps(int n,int step){ int[][] dp=new int[step+1][n]; dp[0][0]=1; for(int i=1;i<=step;i++){ for(int j=0;j<n;j++){ dp[i][j]..原创 2022-03-28 12:53:16 · 379 阅读 · 0 评论 -
零钱兑换问题合集
力扣322 零钱兑换题目要求返回可以凑成总金额的最少硬币数。public int coinChange(int[] coins, int amount){ int[] dp=new int[amount+1]; Arrays.fill(dp,amount+1); dp[0]=0; for(int i=0;i<coins.length;i++){ for(int j=coins[i];j<=amoun原创 2022-03-27 20:42:58 · 657 阅读 · 0 评论 -
力扣1143 最长公共子序列
思路:因为dp[i][j]需要参照dp[i-1][j]和dp[i][j-1],所以需要多设置一行一列作为初始值。没有给i=0和j=0的情况设置初始值是因为都为0,一个长度为0的字符串和任意长度字符串的公共子序列长度一定为0.public int longestCommonSubsequence(String text1, String text2){ int len1=text1.length(); int len2=text2.length(); i.原创 2022-03-27 13:33:12 · 538 阅读 · 0 评论 -
力扣718 最长重复子数组
思路:滑动窗口 public int findLength(int[] A, int[] B) { return A.length<=B.length?findMax(A,B):findMax(B,A); } private int findMax(int[] A, int[] B) { int max=0; int m=A.length; int n=B.length; for(in..原创 2022-03-24 14:53:36 · 132 阅读 · 0 评论 -
剪绳子问题合集
方法一:动态规划dp[i]表示长度为i的绳子剪后的最大值。分情况讨论将长度为i的绳子剪下长度为[2,i)的一段后最大乘积。比如剪下的长度为j,剩下(i-j)的长度是否再剪,如果不剪,就是两段,i和i-j相乘,如果剪,就是i和dp[i-j]相乘。public int cuttingRope(int n){ int[] dp=new int[n+1]; dp[2]=1; for(int i=3;i<=n;i++){ fo原创 2022-03-07 19:02:49 · 715 阅读 · 0 评论 -
剑指offer49 丑数
思路:在已有的丑数序列上每一个数都必须乘2, 乘3, 乘5, 这样才不会漏掉某些丑数。假设已有的丑数序列为[1, 2, 3, ..., n1, n2], 如果单纯的让每个丑数乘2, 乘3, 乘5顺序排列的话肯定会有问题,比如如果按照这样的顺序排列下去肯定有问题[1*2, 1*3, 1*5, 2*2, 2*3, 2*5, 3*2, 3*3, 3*5, ... , n1 *2, n1 * 3, n1 * 5, n2 * 2, n3* 3, n2 * 5],因为后面乘2的数据可能会比前面乘3乘5的数据要小,那原创 2022-03-07 14:40:48 · 100 阅读 · 0 评论 -
力扣494 目标和
public int findTargetSumWays(int[] nums, int target){ int sum=0; for(int num:nums){ sum+=num; } if(sum<target||(sum+target)%2==1) return 0; int finalTarget=(target+sum)/2; int[] dp=new int[M...原创 2022-02-26 10:20:00 · 74 阅读 · 0 评论 -
力扣338 比特位计数
如果是偶数,则1的个数是一样的。因为偶数的末尾一定是0,右移一位不会改变1的个数。public int[] countBits(int num){ int[] dp=new int[num+1]; dp[0]=0; for(int i=1;i<=num;i++){ if(i%2==0){ dp[i]=dp[i>>1]; } else.原创 2022-02-25 21:16:24 · 195 阅读 · 0 评论 -
力扣337 打家劫舍III
public int rob(TreeNode root) { int[] res = dfs(root); return Math.max(res[0], res[1]);//根结点的不偷与偷 } private int[] dfs(TreeNode node){ if(node==null) return new int[]{0,0}; int[] left=dfs(node.left); int[] r.原创 2022-02-25 21:07:17 · 138 阅读 · 0 评论 -
力扣312 戳气球
public int maxCoins(int[] nums){ int len=nums.length; int[] temp=new int[len+2]; temp[0]=1; temp[len+1]=1; for(int i=0;i<len;i++){ temp[i+1]=nums[i]; } int[][] dp=new int[len+2][len+...原创 2022-02-25 20:43:50 · 97 阅读 · 0 评论 -
力扣300 最长递增子序列
public int lengthOfLIS(int[] nums){ int len=nums.length; if(len<2) return len; int[] dp=new int[len]; //以每个数为终点的最长递增序列长度最小为1 Arrays.fill(dp, 1); for(int i=1;i<len;i++){ for(int j=0;j<i;j.原创 2022-02-25 16:49:00 · 193 阅读 · 0 评论 -
力扣221 最大正方形
public int maximalSquare(char[][] matrix){ int height=matrix.length; int width=matrix[0].length; if(matrix==null||height==0||width==0) return 0; int res=0; int [][] dp=new int[height+1][width+1]; for(int ...原创 2022-02-25 15:52:39 · 69 阅读 · 0 评论 -
力扣152 乘积最大子数组
public int maxProduct(int[] nums) { int len = nums.length; if (len == 0) { return 0; } int[][] dp = new int[len][2]; dp[0][0] = nums[0]; dp[0][1] = nums[0]; for (int i = 1; i < ...原创 2022-02-25 14:17:39 · 85 阅读 · 0 评论 -
力扣139 单词拆分
public boolean wordBreak(String s, List<String> wordDict){ int len=s.length(); boolean[] dp=new boolean[len]; Set<String> wordSet=new HashSet<>(wordDict); for(int i=0;i<len;i++){ if(wordSe...原创 2022-02-25 13:33:28 · 99 阅读 · 0 评论 -
力扣96 不同的二叉搜索树
方法一:动态规划public int numTrees(int n) { if(n<2) return n; int[] dp=new int[n+1]; dp[0]=1; dp[1]=1; for(int i=2;i<=n;i++){ for(int j=0;j<i;j++) { dp[i]+原创 2022-02-21 19:22:45 · 111 阅读 · 0 评论 -
力扣55 跳跃游戏
思路:如果某一个作为起跳点的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以是起跳点可以对每一个能作为起跳点的格子都尝试跳一次,把能跳到最远的距离不断更新如果可以一直跳到最后,就成功了public static boolean canJump(int[] nums){ if(nums==null||nums.length==0) return false; int max=0;//能跳的最远距离 for(int i=0;i<=m原创 2022-02-21 10:28:13 · 2534 阅读 · 0 评论 -
回文子串问题合集
方法一:动态规划public String longestPalindrome(String s){ int len=s.length(); if(len<2) return s; boolean[][] dp=new boolean[len][len]; char[] chars=s.toCharArray(); for(int i=0;i<len;i++){ dp[i][i]=tru原创 2022-02-20 16:06:55 · 139 阅读 · 0 评论 -
剑指offer48 最长不含重复字符的子字符串
方法一:动态规划+哈希表public int lengthOfLongestSubstring(String s){ HashMap<Character,Integer> map=new HashMap<>(); int lastDp=0; int res=0; for(int i=0;i<s.length();i++){ int lastIndex=map.getOrDefaul原创 2022-02-20 14:11:10 · 378 阅读 · 0 评论 -
路径问题合集
public int maxValue (int[][] grid) { int m=grid.length; int n=grid[0].length; int[][] dp=new int[m+1][n+1]; for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ dp[i][j]+=Math.max(dp[i-1][j],dp[i].原创 2022-02-20 12:39:15 · 344 阅读 · 0 评论 -
剑指offer19 正则表达式匹配
public boolean isMatch(String A, String B) { int n = A.length(); int m = B.length(); boolean[][] f = new boolean[n + 1][m + 1]; for (int i = 0; i <= n; i++) { for (int j = 0; j <= m; j++) { ...原创 2022-02-19 23:09:24 · 195 阅读 · 0 评论 -
买卖股票的最jia时机合集
二维数组:public int maxProfit(int[] prices) { int len=prices.length; if(len<2) return 0; int[][] dp=new int[len][2]; dp[0][0]=0; dp[0][1]=-prices[0]; for(int i=1;i<len;i++){ //没有持股:一直没有持股或者昨.原创 2022-02-19 21:09:56 · 495 阅读 · 0 评论 -
力扣198 打家劫舍
public int rob(int[] nums){ if(nums.length==0) return 0; int[] dp=new int[nums.length+1]; dp[0]=0; dp[1]=nums[0]; for(int i=2;i<=nums.length;i++){ dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i-1]); ...原创 2022-02-19 20:34:12 · 130 阅读 · 0 评论 -
01背包问题
dp[N][C+1]public int maxValue(int N, int C, int[] v, int[] w) { int[][] dp = new int[N][C+1]; //只放入第一件物品 for (int i = 0; i <= C; i++) { dp[0][i] = i >= v[0] ? w[0] : 0; } for (int i = 1; i &l原创 2022-02-19 15:10:54 · 388 阅读 · 0 评论 -
完全背包问题
力扣 零钱兑换方法一:动态规划思路:举例输入: coins = [1, 2, 5], amount = 11凑成面值为 11的最少硬币个数可以由以下三者的最小值得到:凑成面值为10的最少硬币个数 + 面值为 1 的这一枚硬币;凑成面值为9的最少硬币个数 + 面值为 2 的这一枚硬币;凑成面值为6的最少硬币个数 + 面值为 5 的这一枚硬币。即 dp[11] = min (dp[10] + 1, dp[9] + 1, dp[6] + 1)。凑硬币时需要注意:硬币面值...原创 2022-02-18 15:07:45 · 328 阅读 · 0 评论 -
动态规划-重复子问题合集
剑指offer69 跳台阶public int Fibonacci(int n) { int a=0,b=1,sum; for(int i=0;i<n;i++){ sum=a+b; a=b; b=sum; } return a; }剑指offer10 Fib opublic int climbStairs(int n) { ..原创 2022-02-18 00:27:14 · 138 阅读 · 0 评论 -
连续子数组的最大和合集
线性动态规划public int maxSubArray(int[] nums) { int res=nums[0]; for(int i=1;i<nums.length;i++){ nums[i]+=nums[i-1]>0?nums[i-1]:0; res=Math.max(res,nums[i]); } return res; }原创 2022-02-17 18:48:50 · 193 阅读 · 0 评论