动态规划
傅里叶不想变换_
这个作者很懒,什么都没留下…
展开
-
279. 完全平方数
思路:BFS,每一次是原数字减去了一个平方数,直到出现第一个0,此时走过的层数就是最小数量。比如传入的数是7,那应该就是如果传入16,那应该就是16->15,12,7,0 答案就是层数,也就是1.class Solution { public int numSquares(int n) { Queue<Integer> queue=new LinkedList<>(); HashSet<Integer> visite.原创 2021-08-09 22:27:03 · 77 阅读 · 0 评论 -
300. 最长递增子序列
注意:子序列是可以不连续的思路:动态规划,:定义 dp[i] 表示以 nums[i] 这个数结尾的最⻓递增⼦序列的长度。初始化:dp 数组应该全部初始化为 1,因为子序列最少也要包含自己,所以长度最小为 1。class Solution { public int lengthOfLIS(int[] nums) { int len = nums.length; if(len < 2) return len; int[] dp = new i.原创 2021-06-28 12:31:41 · 86 阅读 · 0 评论 -
63. 不同路径 II
class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { if(obstacleGrid == null || obstacleGrid[0].length == 0) return 0; int m = obstacleGrid.length, n = obstacleGrid[0].length; int[][] dp = new int[m][n];.原创 2021-06-27 21:53:37 · 98 阅读 · 1 评论 -
62. 不同路径
思路:dp[i][j] 表示从 位置[0,0] 到 [i,j] 路径的总数,注意第一行只能从左边走过来,第一列只能从上面走过来,所以应该特殊对待。class Solution { public int uniquePaths(int m, int n) { int[][] dp = new int[m][n]; dp[0][0] = 1; for(int i = 0; i < m; i++){ dp[i][0] = 1.原创 2021-06-27 21:29:47 · 45 阅读 · 0 评论 -
53. 最大子序和
思路1.暴力2.动态规划,dp[i] 表示以 nums[i] 结尾的最大子数组的和3.动态规划优化----滚动数组1.暴力class Solution { public int maxSubArray(int[] nums) { // 初始化最大值 int max = Integer.MIN_VALUE; for(int i = 0; i < nums.length; i++){ int sum = 0; .原创 2021-06-27 20:29:05 · 84 阅读 · 0 评论 -
5. 最长回文子串
思路:动态规划或者中心拓展算法动态规划class Solution { public String longestPalindrome(String s) { int len = s.length(); if(len < 2) return s; int maxLen = 0; int start = 0; // dp[i][j] 表示 s[i..j] 是否是回文串 boolean dp[][.原创 2021-05-31 15:32:05 · 52 阅读 · 0 评论 -
剑指 Offer 49. 丑数
思路:每个丑数都是由前一个丑数 x2或x3或x5而来,那么就会nums2 = {1*2, 2*2, 3*2, 4*2, 5*2, 6*2, 8*2...}nums3 = {1*3, 2*3, 3*3, 4*3, 5*3, 6*3, 8*3...}nums5 = {1*5, 2*5, 3*5, 4*5, 5*5, 6*5, 8*5...}可以得到三个这样的数组,我们维护三个指针,每次都在三个数组中取出一个最小的。核心思想:当一个丑数已经被* 2 * 3 * 5后,对于生成丑数已经没有用了,所以此.原创 2021-01-30 21:10:35 · 59 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串
思路:双指针+滑动窗口,使用哈希表记录每个字母最后一次出现的位置。 public int lengthOfLongestSubstring2(String s) { Map<Character, Integer> map = new HashMap<>(); int left = 0, right = 0, res = 0; for (int i = 0; i < s.length(); i++) { .原创 2021-01-26 22:54:59 · 51 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值
思路:与leetcode120题——最短路径和相似,动态规划,使用dp[i][j] 表示到达位置(i,j)时礼物的最大价值,注意边界条件。初始条件:dp[0][0] = grid[0][0]转移方程:返回值:dp[m-1][n-1]class Solution { public int maxValue(int[][] grid) { if (grid.length == 0 || grid[0].length == 0){ return 0; .原创 2021-01-25 10:32:48 · 93 阅读 · 0 评论 -
Leetcode 413. 等差数列划分
思路:等差数列的性质 A[i] - A[i - 1] == A[i - 1] - A[i - 2]方法1:暴力,一旦当前区间不满足等差数列了,那就不需要继续判断了。class Solution { public int numberOfArithmeticSlices(int[] A) { int n = A.length; if(n < 3) return 0; int count = 0; for(int i = .原创 2021-01-08 11:15:45 · 108 阅读 · 0 评论 -
Leetcode 121.买卖股票的最佳时机
思路:实质上是找数组中后一个元素与之前元素的最大差值暴力法:对于每组 i 和 j(其中 j > i)我们需要找出 max(prices[j] - prices[i])class Solution { public int maxProfit(int[] prices) { int ans = 0; int n = prices.length; for (int i = 0; i < n; i++) { for .原创 2021-01-03 15:24:36 · 98 阅读 · 0 评论 -
Leetcode 42. 接雨水
思路: 当前柱子 i 能接受的雨水为左边最高的柱子l_max,右边最高的柱子r_max中较矮的一个min, 如果min > 当前柱子的高度height[i], 则当前柱子能接收的水为 min - height[i]方法1:暴力法,左右维护一个最高柱子 public int trap(int[] height) { int n = height.length; int ans = 0; // 第一个柱子和最后一个柱子不会有雨水,所以 i .原创 2021-01-03 13:57:21 · 66 阅读 · 0 评论 -
Leetcode 120. 三角形最小路径和
思路1:自顶向下minimumTotal1:自顶向下从第0行开始计数, 第i行有i+1个数字边界条件:1.f[0][0] = triangle.get(0).get(0);2.每行最右端只能由上一行的最右端得到3.每行的最左端只能由上一行的最左端得到4.取 f[n-1][0] 到 f[n-1][n-1] 中的最小值,即为答案class Solution { // 从上至下,f中最后一行的最小值就是答案 public int minimumTotal(List<List.原创 2020-12-29 14:56:11 · 78 阅读 · 0 评论 -
Leetcode 70. 爬楼梯
思路:用 f(x) 表示爬到第 x 级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以可以列出如下式子:f(x) = f(x - 1) + f(x - 2),即斐波那契数列。斐波那契数列的方式:递归和动态规划class Solution { // 递归 public int climbStairs1(int n) { if (n <= 2) return n; return climbStairs1(n-.原创 2020-12-27 16:37:56 · 77 阅读 · 0 评论