04 2023 档案
摘要:题目链接 153. 寻找旋转排序数组中的最小值 思路 首先分析一下旋转数组可能有的状态: 左 < 中 < 右,此时最小值肯定在左边,应当收缩右边界 左 < 中,中 > 右,此时最小值肯定在右半段,应当收缩左边界 左 > 中,中 < 右,此时最小值肯定在左半段,应当收缩右边界 分析这三种状态可以发现,
阅读全文
摘要:题目链接 895. 最大频率栈 思路 很容易想到使用 map:valToFreq 来记录每个值出现的频率,这是没问题的,但关键是如何通过频率寻找到应该返回的数。 这时候我想到再加一个 map:freqToVal 来记录每个频率中出现的数字,为了符合题目返回最接近栈顶的元素的要求,freqToVal
阅读全文
摘要:题目链接 1438. 绝对差不超过限制的最长连续子数组 思路 本题一看就是一个要用到滑动窗口的题目,难点在于如何快速求窗口中的最大值和最小值。幸好 Java 中有 TreeMap 这个数据结构,它在构成 map 映射的同时,还能够保证其中的元素有序,这样就能很方便求得窗口中的最大值和最小值了。 代码
阅读全文
摘要:题目链接 767. 重构字符串 思路 先用哈希表统计出出现次数最多的字符,如果这个次数大于一半,说明这个字符总会挨在一起,直接返回 ""。 如果不超过一半,则先把字符填在偶数位置(先填出现次数最多的字符),偶数位置填满了再填奇数位置。 代码 class Solution { public Strin
阅读全文
摘要:题目链接 740. 删除并获得点数 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums 以前 i 个元素组成(即 nums[i - 1])的状态;dp[i][j] 分别表示以
阅读全文
摘要:题目链接 213. 打家劫舍 II 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums 以前 i 个元素组成(即 nums[i - 1])的状态;dp[i][j] 分别表示以
阅读全文
摘要:题目链接 198. 打家劫舍 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums 以前 i 个元素组成(即 nums[i - 1])的状态;dp[i][j] 分别表示以 num
阅读全文
摘要:题目链接 1277. 统计全为 1 的正方形子矩阵 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums 以前 i 个元素组成(即 nums[i - 1])的状态;dp[i][j
阅读全文
摘要:题目链接 221. 最大正方形 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums 以前 i 个元素组成(即 nums[i - 1])的状态;dp[i][j] 分别表示以 nu
阅读全文
摘要:题目链接 91. 解码方法 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums 以前 i 个元素组成(即 nums[i - 1])的状态;dp[i][j] 分别表示以 nums
阅读全文
摘要:题目链接 1143. 最长公共子序列 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums 以前 i 个元素组成(即 nums[i - 1])的状态;dp[i][j] 分别表示以
阅读全文
摘要:题目链接 718. 最长重复子数组 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums 以第 i 个元素组成(即 nums[i - 1])的状态;dp[i][j] 分别表示以
阅读全文
摘要:题目链接 312. 戳气球 思路 参考动态规划套路解决戳气球问题 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums[i] 为结尾的状态;dp[i][j] 分别表示 以 nums1[
阅读全文
摘要:题目链接 132. 分割回文串 II 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums[i] 为结尾的状态;dp[i][j] 分别表示 以 nums1[i] 和 nums2[
阅读全文
摘要:题目链接 378. 有序矩阵中第 K 小的元素 思路 因为矩阵的每行和每列元素均按升序排序,所以我们可以打破传统思路 代码 class Solution { public int kthSmallest(int[][] matrix, int k) { PriorityQueue<int[]> pr
阅读全文
摘要:题目链接 97. 交错字符串 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums[i] 为结尾的状态;dp[i][j] 分别表示 以 nums1[i] 和 nums2[j] 为
阅读全文
摘要:题目链接 377. 组合总和 Ⅳ 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums[i] 为结尾的状态;dp[i][j] 分别表示 以 nums1[i] 和 nums2[j]
阅读全文
摘要:题目链接 72. 编辑距离 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums[i] 为结尾的状态;dp[i][j] 分别表示 以 nums1[i] 和 nums2[j] 为结
阅读全文
摘要:题目链接 139. 单词拆分 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums[i] 为结尾的状态;dp[i][j] 分别表示 以 nums1[i] 和 nums2[j] 为
阅读全文
摘要:题目链接 304. 二维区域和检索 - 矩阵不可变 思路 显然,一个矩阵的元素和可以拆分成每一行相加。 那一个矩阵的每一行不就是一个个一维数组,一维数组怎么快速求子数组的和?前缀和! 所以这道题很明显就是对输入矩阵建立一个前缀和矩阵,然后求每一行的前缀和差值便能就得子矩阵的和。 代码 class N
阅读全文
摘要:题目链接 523. 连续的子数组和 思路 参考宫水三叶大佬题解 一开始以为和 Leetcode 53 Maximum Subarray 思路差不多,都是求子数组的值。但是后来发现在53题中并没有求出每个子数组的和,只是在贪心的情况下求出了可能的最大和 假设一段子数组的和是 subSum,那么如果要使
阅读全文
摘要:题目链接 1031. 两个非重叠子数组的最大和 思路 // TODO 先见注释 代码 class Solution { public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) { // 求一个前缀和 for(int
阅读全文
摘要:题目链接 1423. 可获得的最大点数 思路 通过逆向思维来考虑,因为我们是从两头拿数字,所以最终剩下的数字一定是位于中间的连续子数组。 因为数组总和不变,所以求两边数字加和的最大值,实际上就是求中间数字加和的最小值 代码 class Solution { public int maxScore(i
阅读全文
摘要:题目链接 53. 最大子数组和 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 在数组的动态规划问题中,一般 dp[i] 都是表示以 nums[i] 为结尾的状态;dp[i][j] 分别表示 以 nums1[i] 和 nums2[j]
阅读全文
摘要:题目链接 218. 天际线问题 思路 参考宫水三叶大佬题解 求最大值 观察上面的图可以发现,我们需要求的其实就只是一个一个小矩形,做的其实相当于一个矩阵分割。并且求得还得是每一段的最大高度。 那么在不断变化的各种数值之间求最大数值,很容易想到使用优先队列,这样在动态的过程中始终能找到最大值。 接下来
阅读全文
摘要:题目链接 45. 跳跃游戏 II 思路 如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。 11. 可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新。 如果从这个 起跳点 起跳叫做第 1 次 跳跃,那么从后面 3 个格子起跳
阅读全文
摘要:题目链接 55. 跳跃游戏 思路 如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。可以对每一个能作为 起跳点 的格子都尝试跳一次,把能跳到最远的距离 不断更新。如果可以一直跳到最后,就成功了。 代码 class Solution { public bo
阅读全文
摘要:题目链接 256. 粉刷房子 假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n
阅读全文
摘要:题目链接 64. 最小路径和 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 表示状态 假设到了右下角,考虑一下我们要存储的信息 走到最后坐标的最小步数 当前坐标的信息,用来判断是否走到了右下角 很容易联想到使用二维数组 dp[i][j
阅读全文
摘要:题目链接 70. 爬楼梯 思路 分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律 表示状态 假设走到了最后一层台阶,考虑一下我们要存储的信息: 走到这最后一层台阶的方法数 当前台阶数,用于判断是否走到了最后一层台阶 这时候很容易想到使用一维数组
阅读全文