LeetCode
leetcode题解
寒泉Hq
当你试图解决一个你不理解的问题时,复杂化就产生了
展开
-
leetcode 873. Length of Longest Fibonacci Subsequence | 873. 最长的斐波那契子序列的长度
https://leetcode.com/problems/length-of-longest-fibonacci-subsequence/被注释掉的部分是负优化。本意是,然而对set做C(2,992)=491536次insert,比优化掉的logM开销还大。原创 2022-07-06 14:18:41 · 705 阅读 · 3 评论 -
leetcode 869. Reordered Power of 2 | 869. 重新排序得到 2 的幂(状态压缩)
https://leetcode.com/problems/reordered-power-of-2/原创 2022-07-04 22:03:55 · 827 阅读 · 0 评论 -
leetcode 866. Prime Palindrome | 866. 回文素数
https://leetcode.com/problems/prime-palindrome/参考了答案:https://leetcode.com/problems/prime-palindrome/solution/自己实现的时候,我把奇数位回文串和偶数位回文串拆开来了,最后去返回两种回文串当中的最小值,觉得这样更严谨,尽管这种严谨可以被数学证明是没有必要的。因为如果位数不同的话,结果的大小不是单调增的,不应该直接return。例如,因为如果先算奇数,再算偶数的话,奇数是比偶数少一位的,这样有可能返回原创 2022-07-03 13:30:16 · 14663 阅读 · 1 评论 -
leetcode 865. Smallest Subtree with all the Deepest Nodes | 865.具有所有最深节点的最小子树(树的BFS,parent反向索引map)
层序遍历,记录最深层;建立树反向索引表;从最深层每个节点向上找parent,路过时,节点经过次数count++,找到最早出现count==n的祖先原创 2022-07-02 22:26:56 · 12924 阅读 · 0 评论 -
leetcode 853. Car Fleet | 853. 车队(Golang)
题目https://leetcode.com/problems/car-fleet/题解看了答案分析我们首先对这些车辆按照它们的起始位置降序排序,并且用 (target - position) / speed 计算出每辆车在不受其余车的影响时,行驶到终点需要的时间。对于相邻的两辆车 S 和 F,F 的起始位置大于 S,如果 S 行驶到终点需要的时间小于等于 F,那么 S 一定会在终点前追上 F 并形成车队。这是因为在追上 F 之前,S 的行驶速度并不会减小,而 F 却有可能因为追上前面的车辆而速原创 2022-02-12 11:29:07 · 13273 阅读 · 0 评论 -
leetcode 822. Card Flipping Game | 822. 翻转卡片游戏(Java)
题目https://leetcode.com/problems/card-flipping-game/题解这个题描述挺复杂,总结起来就一句话:正反面相同的肯定不行,所以找除了正反面相同的以外,其余的数字中最小的那个。class Solution { public int flipgame(int[] fronts, int[] backs) { Set<Integer> invalid = new HashSet<>(); for原创 2022-01-16 17:51:27 · 14801 阅读 · 0 评论 -
leetcode 1345. Jump Game IV | 1345. 跳跃游戏 IV(BFS)
题目https://leetcode.com/problems/jump-game-iv/题解好久没做 hard 了,今天时间多,挑战一下。用 lqy 同学的话说,这题叫做 “苦难题”,哈哈哈。暴力解其实不难,就是个带 seen 数组的 BFS,看草稿吧~class Solution { public int minJumps(int[] arr) { Map<Integer, Set<Integer>> map = new HashMap<原创 2022-01-15 13:22:02 · 14585 阅读 · 0 评论 -
leetcode 816. Ambiguous Coordinates | 816. 模糊坐标(Java)
题目https://leetcode.com/problems/ambiguous-coordinates/题解related topics 说是回溯,我偷了个懒,每次都 new 一个新的 String,就不用回溯了。思路是:把字符串分割成左右两边,分别生成左 list 和右 list,然后左右 list 两两组合。class Solution { public List<String> ambiguousCoordinates(String s) { St原创 2022-01-11 23:23:13 · 13205 阅读 · 0 评论 -
leetcode 813. Largest Sum of Averages | 813. 最大平均值和的分组(暴力递归->傻缓存->DP)
题目https://leetcode.com/problems/largest-sum-of-averages/题解好久不 dp 了,来一道快乐的 dp 保持手感。经典的暴力递归 -> 傻缓存 -> dp,竟然有点手生…class Solution { public double largestSumOfAverages(int[] nums, int k) { // Solution 1: 带缓存的暴力递归 double[][] dp = n原创 2022-01-10 00:14:37 · 12632 阅读 · 0 评论 -
leetcode 802. Find Eventual Safe States | 802. 找到最终的安全状态(有向图DFS)
题目https://leetcode.com/problems/find-eventual-safe-states/题解用 circle 表示所有环上节点和所有能到达环的节点。DFS,实际上每一次遍历都是像遍历链表一样,判断链表是否有环,如果有环,则将整个链放进 circle 中。有个剪枝优化:如果 DFS 过程中,遇到了 circle 中的元素,则说明之前走过的路径也应该被放进 circle 中。最后,返回所有不在 ciecle 中的元素即可。class Solution { i原创 2022-01-01 20:39:52 · 39233 阅读 · 0 评论 -
leetcode 476. Number Complement | 476. 数字的补数(位运算)
题目https://leetcode.com/problems/number-complement/题解class Solution { public int findComplement(int num) { int i = Integer.numberOfLeadingZeros(num); return ~num << i >> i; }}也可以参考评论区的答案:Idea:Flip all bits usin原创 2021-12-27 12:02:55 · 40027 阅读 · 0 评论 -
leetcode 312. Burst Balloons | 312. 戳气球(暴力递归->DP)
题目https://leetcode.com/problems/burst-balloons/题解好久不 DP 了,DP 一下吧,结果被坑了很久,看了答案。递归的时候,我知道分成L,R两边,但是一直按着先删M,再删左右想的,结果删除顺序有依赖。看了答案之后发现,要先删左右,最后删M。因为:如果最后删M,能确定M的左边一定是L-1,右边一定是R+1如果先删M,就不能确定M-1的右边是什么,也不能确定M+1的左边是什么class Solution { public int maxC原创 2021-12-25 23:35:54 · 37543 阅读 · 0 评论 -
leetcode 795. Number of Subarrays with Bounded Maximum | 795. 区间子数组个数(Java)
题目https://leetcode.com/problems/number-of-subarrays-with-bounded-maximum/题解一看数据规模,这题只能 O(1)乍一看,以为是单调栈。一画图,发现是一个排列组合问题。思路如下:首先,将大于 right 的数字圈出来,看作是挡板,把整个数组分割成好几个段。每个段中,包含小于 left 的数字,这些数字是不能单独成群的。所以每个段中的所有可能组合数量 = 段内所有可能组合数量 - 不能单独成群的数字的组合数量。计算组合数量原创 2021-12-23 21:25:16 · 37039 阅读 · 0 评论 -
leetcode 794. Valid Tic-Tac-Toe State | 794. 有效的井字游戏(Java)
题目https://leetcode.com/problems/valid-tic-tac-toe-state/题解1、X必须比O多1个或者相同,否则false2、X和O不能同时都是赢家,否则false3、X赢的时候必须比O多1个,否则false4、O赢得时候个数与X相同,否则false;其他的都是trueclass Solution { public boolean validTicTacToe(String[] board) { int x = 0; // x原创 2021-12-21 11:13:48 · 38803 阅读 · 0 评论 -
leetcode 792. Number of Matching Subsequences | 792. 匹配子序列的单词数(Java)
题目https://leetcode.com/problems/number-of-matching-subsequences/题解一看数据规模,普通暴力解法肯定超时了。想了半天怎么用 Trie,没有想出来,于是直奔评论区。作者的代码很简洁易懂,看完之后自己写了一遍。class Solution { public int numMatchingSubseq(String s, String[] words) { ArrayList<StringBuilder>原创 2021-12-21 00:03:43 · 36690 阅读 · 0 评论 -
计算机科学中的“边际效益递减”理论
计算机科学中的“边际效益递减”理论边际效益递减,不仅仅是一个经济学词汇,在计算机硬件领域,也是这样的。在经济学中,边际效益递减受人的心理影响,当消费某种物品时,开始的刺激一定大,从而人的满足程度就高,但不断的消费同一种物品,即同一刺激不断反复时,人在心理上的兴奋程度或满足必然减少。在计算机科学中,不管是单机还是分布式集群,都存在一个问题:规模越大,维护成本越高。在经济学中,导致这个结果的原因是人的心理。在计算机科学中,导致这个结果的原因是一些瓶颈。经济学中的“不断消费同一种物品”,是物品的增加。对原创 2021-12-16 13:50:25 · 38068 阅读 · 0 评论 -
leetcode 787. Cheapest Flights Within K Stops | 787. K 站中转内最便宜的航班(BFS)
题目https://leetcode.com/problems/cheapest-flights-within-k-stops/题解这题挺坑的实际上。DFS 超时了,因为涉及到步数限制 k,所以并不能加缓存,然后去看了答案。答案给了一种 BFS 解法,看完思路我就开始一顿写。一开始是按照如果走回头路的开销比不走回头路更小的话,就走回头路这种思路来写的。提交的时候发现,能不能走回头路,这个问题会比较复杂。回头路是可以走的,但是不能简单的用回头路的开销去覆盖原有的开销,因为在你走回头路的时候,3步原创 2021-12-16 13:12:26 · 37801 阅读 · 0 评论 -
思考:固态硬盘的普及,是否影响到了存储引擎的设计?
思考 1:固态硬盘的普及,是否影响到了存储引擎的设计?Reference: Let’s Talk About Storage & Recovery Methods for Non-Volatile Memory Database SystemsDBMSs have always dealt with the trade-off between volatile and non-volatile storage devices. In order to retain data after a原创 2021-12-15 16:05:28 · 40907 阅读 · 0 评论 -
从另一个角度理解分布式系统与CAP定理
从另一个角度理解分布式系统与CAP定理参考:性能之殇(七)-- 分布式计算、超级计算机与神经网络共同的瓶颈分布式计算的本质分布式系统的产生,来源于源于人们日益增长的性能需求与落后的x86架构之间的矛盾。人们想办法利用网络和一大票便宜的PC机,通过一顿猛如虎的数学操作,来自己构建一个宏观上更强性能、更高负载能力的计算机,去替换掉昂贵的小型机、大型机。单体服务器 VS 分布式计算:系统规模问题分布式系统的设计,摆脱了单机昂贵的x86服务器,但没有摆脱冯诺依曼结构。原有的单机瓶颈,在分布式系统中仍原创 2021-12-13 18:01:30 · 36563 阅读 · 0 评论 -
Flink 能够改写成 FlinkSQL的理论依据:命令式代码 vs 声明式代码
普通的业务逻辑是否能改写成 SQL?Flink 能够改写成 FlinkSQL的理论依据是什么?当关系模型最初被引入时,就包含了查询数据的不同方法:SQL 是一种声明式查询语言,而 IMS 和 CODASYL 则是命令式。这种差别意味着什么呢?命令式代码 vs 声明式代码例如,我有一个动物物种的列表,想要查询列表中的鲨鱼:1、命令式代码:function getSharks() { var sharks = []; for (var i = 0; i < animals.len原创 2021-12-13 18:00:19 · 38257 阅读 · 0 评论 -
leetcode 785. Is Graph Bipartite? | 785. 判断二分图(DFS,地图着色)
题目https://leetcode.com/problems/is-graph-bipartite/题解有点像简化版的地图着色问题。每走一步,颜色翻转一下,并且染色。当遇到已经染过色的节点时,如果颜色正确,则停止此路径如果颜色错误,则返回 falseDFS完成之后,返回 true。另外,由于本题不保证是连通图,所以对于非连通图来说,可以将两个连通分量独立考察。详见草稿:class Solution { int N; public boolean isBipa原创 2021-12-12 12:42:34 · 36948 阅读 · 0 评论 -
leetcode 911. Online Election | 911. 在线选举(加强堆 + 二分查找)
题目https://leetcode.com/problems/online-election/题解我的解法是,用预计算(加强堆,O(nlogn)) + 二分查找(用的自带TreeMap,查找复杂度O(logn))。实际上,最优解可以达到预计算 O(n),只需要比较当前新元素的 count 与当前最大元素的 count,并更新最大元素即可。下面来说一下为什么用加强堆。系统自带的堆,它不能动态修改元素。就是说,已经入堆的元素,如果参与排序的指标方法变化,它不能自动调整。所以有了加强堆。对于已原创 2021-12-12 00:25:05 · 38442 阅读 · 0 评论 -
leetcode 878. Nth Magical Number | 878. 第N个神奇的数字(数学问题)
题目https://leetcode.com/problems/nth-magical-number/题解看了答案:草稿:class Solution { public static final long MOD = 1000_000_007; public int nthMagicalNumber(int n, int a, int b) { long L = lcm(a, b); // 最小公倍数 long M = L / a + L /原创 2021-12-12 00:18:56 · 39632 阅读 · 0 评论 -
leetcode 790. Domino and Tromino Tiling | 790. 多米诺和托米诺平铺(暴力递归->DP)
题目https://leetcode.com/problems/domino-and-tromino-tiling/题解比较像剑指 offer 里的一道矩形填充题,一看就是个 dp,见草稿:经典的暴力递归 -> DPclass Solution { int N; int MOD = 1000_000_007; int[] dp1; int[] dp2; public int numTilings(int n) { N = n;原创 2021-12-10 09:14:32 · 34990 阅读 · 2 评论 -
leetcode 1306. Jump Game III | 1306. 跳跃游戏 III(BFS)
题目https://leetcode.com/problems/jump-game-iii/题解正如 hint 所说:用 BFS,跳过的就不跳了,直到全部跳过,即 count == arr.length, 则返回 fasle.过程中,如果遇到 arr[i] == 0,则返回 true.class Solution { public boolean canReach(int[] arr, int start) { boolean[] visited = new bool原创 2021-12-09 11:09:43 · 41100 阅读 · 0 评论 -
leetcode 781. Rabbits in Forest | 781. 森林中的兔子(Java)
题目https://leetcode.com/problems/rabbits-in-forest/题解另 answers 中的每一个元素称为 n,那么,n 最多能抵消 n+1 个同类元素。class Solution { public static final int N = 1001; public int numRabbits(int[] answers) { int[] count = new int[N]; for (int i : a原创 2021-12-07 11:28:21 · 38663 阅读 · 0 评论 -
leetcode 779. K-th Symbol in Grammar | 779. 第K个语法符号(Java)
题目https://leetcode.com/problems/k-th-symbol-in-grammar/题解思考 15 分钟,编码 1 分钟。其实目标位置在哪一行不重要,因为每一行都有相同的前缀。详见草稿:class Solution { public int kthGrammar(int n, int k) { boolean reverse = false; while (k != 1) { int sub = 1;原创 2021-12-06 11:34:22 · 37791 阅读 · 0 评论 -
leetcode 1217. Minimum Cost to Move Chips to The Same Position | 1217. 玩筹码(Java)
题目题解所有的 chips,要么在奇数位置,要么在偶数位置class Solution { public int minCostToMoveChips(int[] position) { int p0 = 0; int p1 = 0; for (int n : position) { if (n % 2 == 0) p0 += 1; else p1 += 1; }原创 2021-12-06 11:31:24 · 35595 阅读 · 0 评论 -
leetcode 777. Swap Adjacent in LR String | 777. 在LR字符串中交换相邻字符(双指针)
题目https://leetcode.com/problems/swap-adjacent-in-lr-string/题解本来以为是个带 visited 集合的 DFS,一看数据量,居然是 10^4。然后看了下 hint,Think of the L and R's as people on a horizontal line, where X is a space. The people can't cross each other, and also you can't go from XRX原创 2021-12-05 19:38:13 · 39825 阅读 · 0 评论 -
leetcode 775. Global and Local Inversions | 775. 全局倒置与局部倒置(Java)
题目https://leetcode.com/problems/global-and-local-inversions/题解看了评论区答案。局部倒置一定是全局倒置;局部倒置是连续递减;所以只需判断是否有不连续的全局倒置即可。即,找是否存在 nums[i] 小于 i-1 前的最大值。class Solution { public boolean isIdealPermutation(int[] nums) { if (nums.length <= 2) retur原创 2021-12-04 12:39:27 · 40782 阅读 · 0 评论 -
leetcode 769. Max Chunks To Make Sorted | 769. 最多能完成排序的块(Java)
题目https://leetcode.com/problems/max-chunks-to-make-sorted/题解尽可能切成多份,使得上下的 set 包含相同的值。用 diff 记录当前所有不在正确位置的数字个数。然后类似水平触发,每次 diff=0 的时候,结果 +1.class Solution { public int maxChunksToSorted(int[] arr) { int[] count = new int[arr.length];原创 2021-12-03 08:45:09 · 38732 阅读 · 0 评论 -
leetcode 767. Reorganize String | 767. 重构字符串(贪心+分桶+26路归并)
题目https://leetcode.com/problems/reorganize-string/题解分桶策略,和两个月之前做的 621.Task Scheduler 类似。两个月之前看的答案还有印象,如果是三个月之前,就说不准了。。class Solution { public String reorganizeString(String s) { int L = s.length(); int[][] count = new int[26][2]原创 2021-12-03 00:11:26 · 39585 阅读 · 0 评论 -
leetcode 763. Partition Labels | 763. 划分字母区间(双指针)
题目https://leetcode.com/problems/partition-labels/题解将问题转化成线段分割问题:找到所有可以切的点,使得每一个线段都不会被切到class Solution { public List<Integer> partitionLabels(String s) { int[][] range = new int[26][2]; for (int i = 0; i < 26; i++) {原创 2021-12-01 09:32:05 · 43597 阅读 · 0 评论 -
leetcode 756. Pyramid Transition Matrix | 756. 金字塔转换矩阵(BFS)
题目https://leetcode.com/problems/pyramid-transition-matrix/题解BFS,把 pattern 用 map 存起来,然后 bfs 从下向上一层一层尝试每个 pattern 是否可行。注意状态的转移。class Solution { int N; Map<String, List<Character>> map; public boolean pyramidTransition(String bo原创 2021-11-30 11:47:52 · 43462 阅读 · 0 评论 -
leetcode 754. Reach a Number | 754. 到达终点数字(数学问题)
题目https://leetcode.com/problems/reach-a-number/题解一看数据规模,再看踩的数量,觉得这题不一般。。只能想出暴力解,不用试了,肯定超时。没有想到如何 dp(dp 即便可以,O(n) 应该也会超时)看了 答案,这是个数学问题。时隔两天,重新理了下思路,然后实现了一下:class Solution { public int reachNumber(int target) { int diff = -Math.abs(targ原创 2021-11-29 10:30:01 · 40555 阅读 · 0 评论 -
leetcode 797. All Paths From Source to Target | 797. 所有可能的路径(回溯法)
题目https://leetcode.com/problems/all-paths-from-source-to-target/题解回溯,中规中矩,直接上代码。class Solution { int N; public List<List<Integer>> allPathsSourceTarget(int[][] graph) { N = graph.length; boolean[][] g = new boolean原创 2021-11-28 10:55:00 · 39393 阅读 · 0 评论 -
leetcode 752. Open the Lock | 752. 打开转盘锁(BFS)
题目https://leetcode.com/problems/open-the-lock/题解先写了个 DFS,超时了。看了下 Related Topics,提示说应该是 BFS。这已经不是第一次遇到 BFS 可以、DFS 超时的题目了。总结了一下,对于这种可以用 DFS/BFS 求最短路径的题目,优先选择 BFS,因为你到达目标的可能性有超级多种,而大多数路线都走了很多弯路,去遍历它们都是无用功。用 BFS 的话,从 step=1 开始逐渐递增,在 step 受限的情况下,只要到达了目标,当原创 2021-11-27 18:48:44 · 38121 阅读 · 0 评论 -
leetcode 743. Network Delay Time | 743. 网络延迟时间(邻接矩阵,Dijkstra 算法)
题目https://leetcode.com/problems/network-delay-time/题解有向图,求源点到所有顶点的最短距离,经典 Dijkstra 算法,只要知道思路就能实现,然而每次思路都要重新查一遍,过几个月又忘了。。Dijkstra 算法1)Dijkstra 算法必须指定一个源点2)生成一个源点到各个点的最小距离表,一开始只有一条记录,即原点到自己的最小距离为0,源点到其他所有点的最小距离都为正无穷大3)从距离表中拿出没拿过记录里的最小记录,通过这个点发出的边,更新源原创 2021-11-26 10:44:40 · 42606 阅读 · 0 评论 -
leetcode 738. Monotone Increasing Digits | 738. 单调递增的数字(Java)
题目https://leetcode.com/problems/monotone-increasing-digits/题解先把 num 的每一位转化为数组。从左往右找第一个 前>后 的位置,记为a[i]。指针从 i 位置开始,回退到 a[i-1]==a[i] 的第一个位置。新的位置仍记为 i。最后,将 a[i]–,i 以后的位置全置为 9,生成新的数组即为所求。class Solution { public int monotoneIncreasingDigits(int n原创 2021-11-25 10:37:50 · 38043 阅读 · 0 评论 -
leetcode 986. Interval List Intersections | 986. 区间列表的交集(双指针)
题目https://leetcode.com/problems/interval-list-intersections/题解本题用双指针。(想了下,也可以用线段树,和天际线那道题类似)class Solution { public int[][] intervalIntersection(int[][] firstList, int[][] secondList) { int i = 0; int j = 0; List<int[]&g原创 2021-11-24 08:41:46 · 38527 阅读 · 0 评论