随笔分类 - 算法
记录自己不大熟的LeetCode题目
摘要:题目链接 322. 零钱兑换 思路 因为硬币数量是无限的,所以无法以硬币数量作为状态进行遍历。选择目标金额为状态进行遍历。即 表示目标金额为 的情况下所需的最小硬币个数。 对于每个目标金额,遍历每个硬币 ,当前状态转移为: \[dp[i] = \min(dp
阅读全文
摘要:# 题目链接 [340. 至多包含 K 个不同字符的最长子串](https://leetcode.cn/problems/longest-substring-with-at-most-k-distinct-characters/description/ "340. 至多包含 K 个不同字符的最长子串
阅读全文
摘要:题目链接 395. 至少有 K 个重复字符的最长子串 思路 代码 class Solution { public int longestSubstring(String s, int k) { int ans = 0; int len = s.length(); char[] cs = s.toCh
阅读全文
摘要:题目链接 240. 搜索二维矩阵 II 思路 逐行判断 逐行检查最右侧的元素是否比 target 大,如果比 target 大则对当前行进行二分搜索。 二分矩阵 待完成 代码 逐行判断 class Solution { public boolean searchMatrix(int[][] matr
阅读全文
摘要:题目链接 74. 搜索二维矩阵思路 思路 因为矩阵中每行都按升序排列,且每行的第一个整数大于前一行的最后一个整数。所以整个矩阵其实就是一个大的升序的一维数组,可以使用二分查找的方法对“一维数组”进行搜索,只不过在获取元素的过程中需要进行一步一维索引到二维索引的映射。 代码 class Solutio
阅读全文
摘要:题目链接 278. 第一个错误的版本 思路 二分查找 代码 public class Solution extends VersionControl { public int firstBadVersion(int n) { int left = 1, right = n - 1; while (l
阅读全文
摘要:题目链接 33. 搜索旋转排序数组思路 思路 都在注释里 代码 class Solution { public int search(int[] nums, int target) { int len = nums.length; if(len == 0){ return -1; } int lef
阅读全文
摘要:题目链接 528. 按权重随机选择 思路 参考宫水三叶大佬思路 可以回忆一下概率论中所学到的:密度函数与分布函数 在这个题里面呢,数组 w 其实就给出了下标 i 被选中的“概率”(因为总和不是1,所以加了引号),而我们知道离散情况下,分布函数是由密度函数加和求出来的,所以可以使用前缀和
阅读全文
摘要:题目链接 540. 有序数组中的单一元素 思路 假如不存在单个的元素,那么在奇数位置上总是成对元素的第一个元素,偶数位置上总是成对元素的第二个元素,但是如果加入了单个元素呢? 我们可以看到在单个元素的左边这个特点没有变化,但是在单个元素的右边,奇数位置上总是成对元素的第二个元素,偶数位置上总是成对元
阅读全文
摘要:题目链接 69. x 的平方根 思路 基本思路是在区间 中使用二分查找(因为平方根必然小于 ),只不过需要注意一些细节。 因为使用的是闭区间查找,所以判断循环终止的条件为 。 为了防止溢出,使用 mid = (right - left
阅读全文
摘要:题目链接 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
阅读全文