![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
刷题笔记
BlueStragglers
个人网站:www.bluestragglers.com
展开
-
力扣刷题笔记——第797题. 所有可能的路径
第797题. 所有可能的路径参考题解:官方题解题目:标签:深度优先遍历。思路:这道题思路是很简单的。而且是有向无环图,都不用考虑环了。这种题是面试必须要会的。不过,这道题有一些 Java 语言的语法细节很有意思,如果不熟练可能会吃亏。首先,Deque 的使用。Deque 我个人认为是比 Queue 更好用的类型,就是双端队列,左右两侧都可以添加和删除,实现类有 ArrayDeque 和 LinkedList,方法是 offerFirst、pollFirst、offerLast、pol原创 2021-08-25 11:00:44 · 155 阅读 · 0 评论 -
力扣刷题笔记——第787题. K站中转内最便宜的航班
第787题. K站中转内最便宜的航班个人题解:动态规划求解问题题目:标签:动态规划。思路:这道题是一道典型的动态规划题。看到最便宜航班这类字样就应该判断动态规划,而不是图论类算法。判断这道题是动态规划而不是迪杰斯特拉算法,是一步关键思想。随后需要判断:dp数组是几维?外层是什么?内层是什么?外层根据分析,应该是中转次数。内层则是机场。随后判断dp内容。这里很简单应该都是 Integer.MAX_VALUE 作为基础值。最后一个难点是转移方程怎么写。经过思考后应该是:dp[i][原创 2021-08-24 09:42:39 · 249 阅读 · 0 评论 -
力扣刷题笔记——面试题 10.02 变位数组
个人题解:HashMap 求解问题题目:标签:考研编码。思路:这道题没什么难点。首先构建一个数组,将所有原数组的字符串按照字符进行排序,得到一个标准字符串列表。随后构建 HashMap,存储标准字符串和在结果数组中的位置。最后在结果数组中构建答案即可。题解:class Solution { public List<List<String>> groupAnagrams(String[] strs) { List<List&l原创 2021-07-18 12:57:56 · 97 阅读 · 0 评论 -
力扣刷题笔记——第1418题. 点菜展示表
BlueStragglers 共享技术成长的快乐个人题解:题目挺简单,就是有点难题目:标签:又臭又长。思路:这道题考察的点还是蛮多的,最主要是考察了对语言的熟悉程度。最后写出的代码都是又臭又长的。不过也还挺优雅,挺有成就感。题解:class Solution { public List<List<String>> displayTable(List<List<String>> orders) { HashMa原创 2021-07-06 09:13:09 · 71 阅读 · 0 评论 -
力扣刷题笔记——第401题. 二进制手表
参考题解:官方题解题目:标签:意想不到。位运算。思路:这道题是一道简单题,只需要枚举就可以解决。然而,必须要知道这是一道枚举题。否则可能会想歪。枚举所有数字,用 bitCount 计算对应的比特数,保留符合要求的组合,并生成符合格式要求的题解。题解:class Solution { public List<String> readBinaryWatch(int turnedOn) { List<String> ans = new原创 2021-06-21 15:11:42 · 120 阅读 · 0 评论 -
力扣刷题笔记——第1744题. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
BlueStragglers 共享技术成长的快乐个人题解:前缀和求解问题题目:标签:恶心。思路:这道题是考察前缀和。这个没什么难的。难点在于,如何通过所有样例!难点1:采用 long 保存元素,避免溢出问题!难点2:long fu = (long)(favoriteDay + 1) * dailyCap; 这里面如果不加一个强制转换,会导致结果溢出!原因是里面乘法元素全部都是 int 形的,直接乘会导致按照 int 形计算,最后返回一个 int 形给 long,不会报错,但结果不正确原创 2021-06-02 09:14:23 · 87 阅读 · 0 评论 -
力扣刷题笔记——第523题. 连续的子数组和
BlueStragglers 共享技术成长的快乐参考题解:官方题解题目:标签:意想不到。数学。恶心。思路:这道题其实是考验数学的。很多题都是这样,前缀和要和哈希表配合。以后看到前缀和,第一时间就要考虑到是不是和哈希表要配合。和哈希表配合,就要找到规律。这道题的规律就是,连续数组值要是 k 的倍数,那前后端的前缀和相对于 k 的余数就要相等。因此,只需要一遍扫描就可以,当扫描到后端的余数时,就要检查是否有前端的余数和它相等。如果相等,并且数组大小符合要求,就可以返回 true原创 2021-06-02 09:13:15 · 89 阅读 · 0 评论 -
力扣刷题笔记——第477题. 汉明距离总和
BlueStragglers 共享技术成长的快乐参考题解:官方题解题目:标签:位运算。意想不到。数学。思路:这道题和前面的一道题,汉明距离,是比较相关的。但是,那道题的方法如果直接拿过来用,会超时的。暴力法。但是需要使用 Integer.bitCount() 方法,才能暴力法,不然时间和空间都会超。数学方法:针对32位的 Int 的每一位统计 1 的个数。两两之间的不同位置之和为 c * (n - c),其中 c 是 1 的个数,n - c 是 0 的个数。题解:第一种原创 2021-05-28 14:47:15 · 93 阅读 · 0 评论 -
力扣刷题笔记——第461题. 汉明距离
BlueStragglers 共享技术成长的快乐参考题解:官方题解题目:标签:位运算。思路:这道题包括了位运算的典型内容。比较不同位置,首先要求异或,然后针对每一位,要用与运算,获取每一位是否为1。最后,通过位移运算移动数。题解:class Solution { public int hammingDistance(int x, int y) { int res = 0, val = x ^ y; while (val != 0) {原创 2021-05-28 12:33:32 · 76 阅读 · 0 评论 -
力扣刷题笔记——第664题. 奇怪的打印机
BlueStragglers 共享技术成长的快乐参考题解:官方题解题目:标签:动态规划。思路:可以转化为 i 到 j 之间的打印最少次数。初始条件:dp[i][i] = 1。转移条件:如果字符串在 i 的位置和 j 的位置一样,则可以考虑前一个点,也就是 dp[i][j] = dp[i][j - 1]。否则,考虑中间一个 k ,前半部分和后半部分求和,取最小值。为了确保动态规划计算顺序,需要左指针 i 从右往左,右指针 j 从左往右。当然右指针必须在左指针右边。原创 2021-05-24 21:07:51 · 132 阅读 · 0 评论 -
力扣刷题笔记——第897题. 递增顺序搜索树
参考题解:官方题解问题:思路:这道题就是中序遍历。这里感觉要注意几点,能更加专业:哨兵节点命名为 dummy,当前节点命名为 cur。前序遍历命名为 preorder,中序遍历命名为 inorder,后序遍历命名为 postorder。题解:class Solution { public TreeNode increasingBST(TreeNode root) { List<Integer> res = new ArrayList<Integer原创 2021-05-24 21:06:54 · 91 阅读 · 0 评论 -
力扣刷题笔记——第1011题. 在 D 天内送达包裹的能力
参考题解:官方题解问题:思路:这道题我一开始以为是动态规划,毕竟满足了最值问题和条件转移的思路。一看题解,看来道行还是不够,这是二分查找。这道题是一道带判断的二分查找。左边界是最大货物重量,右边界是总体重量。题解:class Solution { public int shipWithinDays(int[] weights, int D) { // 确定二分查找左右边界 int left = Arrays.stream(weights).max(原创 2021-05-20 14:40:54 · 159 阅读 · 0 评论 -
力扣刷题笔记——第633题. 平方数之和
BlueStragglers 分享技术成长的快乐参考题解:官方题解题目:思路:这道题其实蛮简单的,我用 TreeSet 配合 0 到 sqrt 扫描过了。但是答案提供了另一种思路:双指针。左指针为 0, 右指针为 sqrt(c),然后往中间找就行。题解:class Solution { public boolean judgeSquareSum(int c) { int left = 0; int right = (int) Math.sqrt(原创 2021-05-20 09:31:39 · 99 阅读 · 0 评论 -
力扣刷题笔记——第403题. 青蛙过河
BlueStragglers 分享技术成长的快乐参考题解:官方题解问题:标签:动态规划。思路:这是一道典型的动态规划题。用二维布尔数组存储状态。DP[0][0] 为初始状态为 true。状态转移 DP[I][K] = DP[J][K - 1] || DP[J][K] || DP[J][K + 1]。当两个石头间距大于 i 时没有答案。题解:class Solution { public boolean canCross(int[] stones) {原创 2021-05-20 09:28:01 · 93 阅读 · 0 评论 -
力扣刷题笔记——第137题. 只出现一次的数字2
参考题解:官方题解问题:标签:位运算。思路:对每一位都求和,然后 % 3。如果不为 0,结果就与它 |= 一下。难点1:sum += ((num >> i) & 1);难点2:if (sum % 3 == 1) {res |= (1 << i)};上面两个写的都非常漂亮巧妙。题解:class Solution {public: int singleNumber(vector<int>& nums) {原创 2021-05-20 09:21:45 · 64 阅读 · 0 评论 -
力扣刷题笔记——第554题. 砖墙
参考题解:官方题解问题:标签:哈希表。意想不到的方法。思路:这道题,我本以为是动态规划之类的,没想到是哈希表。由于穿过的砖块加上边缘的总和是定值,因此目标是让穿过的边缘最多,这样砖块就最少了。然后用哈希表进行统计即可。题解:class Solution { public int leastBricks(List<List<Integer>> wall) { Map<Integer, Integer> cnt = ne原创 2021-05-20 09:15:19 · 128 阅读 · 0 评论 -
力扣刷题笔记——第7题. 整数反转
参考题解:官方题解题目:标签:意想不到。思路:这道题难点在于,环境不允许存储超过32位的整数,包括符号位。其实符号位可以理解为一定会占用一位。最大数和最小数可以用 Integer.MAX_VALUE 和 Integer.MIN_VALUE。这样就清晰、简单了。题解:class Solution { public int reverse(int x) { int rev = 0; while (x != 0) { if原创 2021-05-20 09:12:46 · 132 阅读 · 0 评论 -
力扣刷题笔记——第1482题. 制作 m 束花所需的最少天数
参考题解:小明种花(推荐!清晰易懂又可爱的题解)题目:标签:二分查找。思路:这道题和前面介绍的 40 题,也就是 1011 题码头运货特别像。二分查找,边界是天数。然后根据 mid 指向的天数,找到符合要求又天数最少的答案。题解:class Solution { public int minDays(int[] bloomDay, int m, int k) { int n = bloomDay.length; if (m * k >原创 2021-05-20 09:11:02 · 139 阅读 · 0 评论 -
力扣刷题笔记——1310题. 子数组异或查询
个人题解:前缀和求异或题目:标签:位操作。思路:这道题难就难在,边界条件。一开始边界条件判断错,很有可能会慌乱。这在面试中也很容易造成问题。边界条件就是,需要在最前面添加一个0,来避免 left 为 0 的情况。右边界是闭的,所以右边界要 + 1。认清这一点就好办了。题解:class Solution { public int[] xorQueries(int[] arr, int[][] queries) { int length = arr.lengt原创 2021-05-20 09:09:56 · 80 阅读 · 0 评论 -
力扣刷题笔记——第12、13题. 罗马数字与整数的转换
参考题解:整数转罗马数字 官方题解。罗马数字转整数 官方题解。题目:标签:贪心法。思路:两道题都是贪心法,这是不容易想到的,需要背下来。第一道题从大到小构建数组即可。第二道题需要构建字典。都非常考验编程能力。题解:public class Solution { public String intToRoman(int num) { int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9,原创 2021-05-20 09:09:15 · 78 阅读 · 0 评论 -
力扣刷题笔记——第692题. 前 K 个高频单词
参考题解:官方题解题目:标签:哈希表。排序。思路:这道题很考验编码能力。涉及到了:哈希表、排序改写。难点1:map.put(word, map.getOrDefault(word, 0) + 1);难点2:for (Map.Entry<String, Integer> entry : map.entrySet())难点3:Collections.sort(res, new Comparator<String>()) {@Override public int原创 2021-05-20 09:07:16 · 165 阅读 · 0 评论 -
力扣刷题笔记——第403题. 青蛙过河
第403题. 青蛙过河参考题解:官方题解问题:标签:动态规划思路:这是一道典型的动态规划题。用二维布尔数组存储状态。DP[0][0] 为初始状态为 true。状态转移 DP[I][K] = DP[J][K - 1] || DP[J][K] || DP[J][K + 1]。当两个石头间距大于 i 时没有答案。题解:class Solution { public boolean canCross(int[] stones) { int n = stones原创 2021-04-29 08:48:59 · 147 阅读 · 0 评论 -
力扣刷题笔记——第377题. 组合总和 4
参考题解:官方题解问题:思路:这道题一看就发现,和爬梯子是一样的。难点在于:爬梯子一般只有两个步伐,一次一层和一次两层,而这个有 nums 种步伐。其实办法就是:在内部加一个遍历,如果步伐比梯子数少,就加上那个减去那个步伐的 dp 的状态。这样其实就和爬梯子一样了。题解:class Solution { public int combinationSum4(int[] nums, int target) { int length = nums.length;原创 2021-04-24 09:44:49 · 143 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
参考题解:二叉树的前序遍历 (分支思想)这道题的思路包括:根据前序遍历和中序遍历,可以很轻易看出,前序遍历可以获取根节点,然后将中序遍历划分为两个子区间,这是一个清晰的分治问题。但是,如何根据前序遍历数组,将两个遍历数组联系起来,这就需要通过 HashMap 存储每个前序遍历节点的位置。随后,建树函数需要存储前序遍历和中序遍历分别对应的数组中的起始和终止的位置。最后,分治时的子树的左右节点,对应的前序、中序遍历的起始、终止位置,这里需要记忆一下。可以分别记忆前序和中序的内容,因为都是两两对应的。原创 2021-04-12 20:38:13 · 41 阅读 · 0 评论 -
第 84 题. 柱状图中最大的矩形
参考题解:单调栈入门,使用单调栈快速寻找边界这道题可以分为两种思路:限定高度。限定宽度。其中,限定宽度的复杂度是 O(n^2),限定高度复杂度是 O(n),因此选择,固定每个柱的高度,向左右延伸,看看有没有比最大值还要大的矩形。单调栈是一种很适合这里的数据结构,如果新的元素比栈顶元素大,入栈。如果比栈顶元素小,就一个个弹出,直到栈没有元素或者新元素比栈顶元素大。元素出栈时,说明新元素是出栈元素向后找第一个比其小的元素。元素出栈后,说明新栈顶元素是出栈元素向前找第一个比其小的元素。代原创 2021-04-12 20:37:29 · 55 阅读 · 0 评论 -
剑指 Offer 40. 最小的 k 个数
参考题解:4种解法秒杀 TopK (快排、堆、二叉搜索树 BST、计数排序)这道题基于排序做十分简单。但是,由于只需要求最小的 k 个数,因此其实不用全部排序,只需要排序最小的 k 个即可。因此,考虑做法:1. 快速排序class Solution { public int[] getLeastNumbers(int[] arr, int k) { if (k == 0 || arr.length == 0) { return new int[0];原创 2021-04-12 20:36:33 · 71 阅读 · 0 评论