前言
###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!
习题
1.不同路径II
题目链接:63. 不同路径 II - 力扣(LeetCode)
题面:
基本分析:和上一篇文章的同步路径项目,只需要知道如果A点是障碍点,那么到A的路径条数为0,如果A在第一行或者第一列,那么A点在第一行的后面的点和在第一列下面的点的路径为0
代码:
class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {return dfs(new HashMap<Pair,Integer>(), obstacleGrid, 0, 0);}private int dfs(Map<Pair,Integer> cache, int[][] arr, int i, int j) {Pair p = new Pair(i,j);if(cache.containsKey(p))return cache.get(p);if(i>=arr.length||j>=arr[0].length||arr[i][j]==1)return 0;if(i==arr.length-1&&j==arr[0].length-1)return 1;int ref = dfs(cache,arr,i+1,j)+dfs(cache,arr,i,j+1);cache.put(p,ref);return ref;}
}
2.整数拆分
题目链接:343. 整数拆分 - 力扣(LeetCode)
题面:
基本分析:数学分析可知,要尽可能拆分为3,如果余数是2,就要返回一个3并拆成2*2,因为2*2>1*3,至于为什么,详细可前往力扣题解页看大佬证明
代码:
class Solution {int[] arr;public int integerBreak(int n) {if(n==2)return 1;if(n==3)return 2;if(n==4)return 4;int flag = 1;while(n-3>=0){flag*=3;n-=3;}if(n==2)return flag*2;if(n==1){flag/=3;return flag*4;}return flag;}}
后言
上面是动态规划的基本概念和部分习题,下一篇会有其他习题,希望有所帮助,一同进步,共勉!