![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode题解
力扣的题解和思路
爱敲代码的Jerry
这个作者很懒,什么都没留下…
展开
-
leetcode 146. LRU 缓存机制
题目传送门:力扣链接:https://leetcode-cn.com/problems/lru-cache/题解:LRU是最近最少使用算法,可以通过一个hash表对应key, value,问题在于如何记录谁是最久没用过的,我们可以采用一个双向链表,如果某个结点被使用了,那么就把他放在链表的最左侧,这样如果容量不够需要删除了,最右侧的那个就是最久没使用过的了。Code:class LRUCache {public: struct Node { int key, va原创 2021-03-19 15:00:39 · 110 阅读 · 2 评论 -
leetcode 126. 单词接龙 II
题目传送门力扣链接:https://leetcode-cn.com/problems/word-ladder-ii/题解:根据题意,首先我们得看一下endWord在不在list中,如果不在直接返回一个空的即可。如果在的话,那么我们可以先用bfs跑一边,求出beginWord到endWord的距离,同时也求出了beginWord到中间路径上的点的距离,当所有距离计算出来之后,我们只需要从endWord反向dfs搜索一遍,每次变换一个字符,如果变换之后存在这个字符串并且已经计算过距离且距离之差为1,原创 2021-03-19 14:52:18 · 160 阅读 · 1 评论 -
leetcode 315. 计算右侧小于当前元素的个数
题目传送门力扣链接:https://leetcode-cn.com/problems/count-of-smaller-numbers-after-self/题解:可以暴力做,枚举右侧的点有多少个小于当前点。但是这种O(n^2)的做法会导致超时。我们统计的时右侧有多少个比当前点小的,那么从右向左侧枚举,我们需要一种操作,可以快速给比当前点大的数都加一,还需要一种操作,可以快速求出比当前点小的数有多少个。样例如下图:从右侧的1开始,因为一开始没有任何的数据插入,所以比它小的一定是0个之后原创 2021-03-19 14:37:37 · 116 阅读 · 1 评论 -
leetcode 268. 丢失的数字
题目传送门力扣链接:https://leetcode-cn.com/problems/missing-number/题解:从0到n之间有一个数字不在数组中,我们将0~n这些数字加起来,减去数组中数字的总和就是答案。Code:class Solution {public: int missingNumber(vector<int>& nums) { int sum = nums.size(); for (int i = 0; i &原创 2021-03-19 14:06:00 · 89 阅读 · 0 评论 -
leetcode 406. 根据身高重建队列
题目传送门:力扣链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height/题解:该题核心是让我们讲被打乱的数组还原。满足在当前位置 i 左面身高大于等于他的身高的人有 ki 个。我们可以从身高最矮的人下手,我们找到最矮的那个人,无论他处于什么位置,他左面有多少个人,那他左面比他高的人就有多少个。 这第一个人的位置就确定了,ki 是几,我们就把这个人放在哪个位置上。然后看第二矮的人,这时候第一个人对于第二个人来说毫无意原创 2021-03-18 22:03:50 · 99 阅读 · 0 评论 -
leetcode 415. 字符串相加
题目传送门力扣链接:https://leetcode-cn.com/problems/add-strings/题解:模拟题,官方的题解是通过i, j两个指针去相加字符串的每一位,从后往前加,然后加到res上,用add来保存进位是多少,如果 i, j某一个到头了,那么默认他的一位是0,这样模拟出结果。这里我们的思路是保证第一个字符串比第二个字符串长(不是的话交换字符串即可),然后反转两个字符串,算一下两个字符串差多少位,给第二个字符串补上对应个数的0,这样操作之后我们可以保证两个字符串的长度相同原创 2021-03-18 21:33:59 · 81 阅读 · 0 评论 -
leetcode 46. 全排列
题目传送门力扣链接:https://leetcode-cn.com/problems/permutations/题解:使用dfs,暴力搜索所有的情况。每一层枚举所有未被使用过的点,然后打上标记告诉后面不能再用这个数字了(题目说明了没有重复数字,所以可以这样打标记),继续搜索下一层即可。这里可以发现枚举所有未被使用过的点,也就没法剪枝。Code:class Solution {public: vector<vector<int>> res; // 记录答案原创 2021-03-18 21:22:07 · 99 阅读 · 0 评论 -
LeetCode 198. 打家劫舍(动态规划水题)
解题流程解题思路:AC代码:解题思路:简单题,看出是dp之后一开始想的是一维就能表示。错误想法:f[i] 表示前 i 个屋子最多偷多少钱,然后想了下方程是前一天可以偷也可以不偷。然后发现f[i]不能确定第i个偷没偷。所以把定义改成前i个屋子最多偷多少钱并且第 i 天偷了。然后一想又不对。可以是前一天偷了,但是如果前一天没偷没法表示。于是这道简单题错误想法出现了两次。状态表示:f[i][?] 表示前i天最多能偷多少。?是0表示第 i 天没偷,是1表示偷了。状态计算:f[i][0] 前一天可以偷可原创 2020-08-10 21:20:15 · 114 阅读 · 0 评论 -
76. 最小覆盖子串(java实现,题解,双指针, 哈希)
题目传送门解题流程吐槽:解题思路:代码实现:吐槽:首先java的空指针异常的确是思路不够清晰导致的,但是做题方面和c++比起来也太坑了吧。搞明白算法就不容易了,居然还要处理各种java需要的细节。难度倍增。我直接吐血身亡。。。解题思路:这道题的意思是让我们找出一个字符串s的某一个子串。这个子串满足的条件是包含另一个字符串t的所有字符。那问题就转成了将字符串t的所有字符统计起来。看看s的哪个子串能包含这个统计。(当然,子串长度要最小)。此题的解法是双指针做法 + 哈希表:我们先统计出字符串原创 2020-08-06 23:40:52 · 231 阅读 · 0 评论 -
167. 两数之和 II - 输入有序数组(java代码和题解)
题目传送门解题流程解题思路:代码实现:解题思路:由于数组的顺序是有序的,并且一定有唯一的答案。那要找出这两个相加等于目标的数字,使用两个指针。一个从左,一个从右,分别向中间逼近,从而找到答案。具体流程:如果左指针数字+右指针数字<target,说明两者相加小了,要让整体变大,左指针向右移(因为有序,所以向右移数字变大)。左指针数字+右指针数字>target,要让整体变小,右指针左移即可。代码实现:class Solution { public int[] twoSum原创 2020-08-01 16:59:54 · 156 阅读 · 0 评论 -
LeetCode 120. 三角形最小路径和(java代码和题解)
题目传送门解题流程解题思路:代码实现:解题思路:如果从上往下遍历去加,类似于dfs的搜索过程,复杂度较高。采取dp的方式,从下往上加,要路径上的最小和。那最优解一定是加下一层较小的比较好,将下面所有层的最小值算出来,选取左右最小值加上即可。dp分析:考虑状态的表示:f[i][j],表示从第i层第j个开始最小值是多少。f[0][0]就是从根开始最小值是多少,即为答案。考虑状态计算:f[i][j]的最小值,因为只能走左下和右下,当前(i,j)值固定,所以f[i][j] = val[i][j原创 2020-07-31 11:23:23 · 132 阅读 · 0 评论 -
LeetCode 118. 杨辉三角
题目传送门递推模拟,写烂了的从上往下,每行第一个和最后一个是1,其他的arr[i][j] 由arr[i-1][j-1]和arr[i-1][j]推出来。class Solution { public List<List<Integer>> generate(int numRows) { List<List<Integer>> res = new ArrayList<>(); if(numRows == 0原创 2020-07-31 11:04:18 · 84 阅读 · 0 评论 -
LeetCode 112. 路径总和(java代码)
题目传送门解题流程解题思路:代码实现:注意:解题思路:一道dfs题,从根节点向左右两侧递归,如果两侧都没有节点,说明是子节点,此时判断一下是不是和目标值相同即可。代码实现:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; }原创 2020-07-31 10:38:29 · 102 阅读 · 0 评论 -
LeetCode 154. 寻找旋转排序数组中的最小值 II(java代码和思路分析)
题目传送门解题流程解题思路:代码实现:复杂度解题思路:和上一道题其实一样,直接二分即可。只不过有些地方影响了二分的判断。class Solution { public int findMin(int[] nums) { int l = 0, r = nums.length - 1; if(nums[0] < nums[r]) return nums[0]; while (l < r) { int mid =原创 2020-07-30 22:11:39 · 105 阅读 · 0 评论 -
LeetCode 153. 寻找旋转排序数组中的最小值(java代码和思路分析)
题目传送门解题流程解题思路:代码实现:解题思路:没啥说的,直接二分。如果mid的值比最左侧的那个大,说明最小值在mid的右边。否则在mid的左边。代码实现:class Solution { public int findMin(int[] nums) { int l = 0, r = nums.length - 1; // 如果直接是升序的,返回即可 if(nums[0] < nums[r]) return nums[0];原创 2020-07-30 21:47:21 · 128 阅读 · 0 评论 -
LeetCode 152. 乘积最大子数组(java代码和思路分析)
题目传送门解题流程解题思路:代码实现:解题思路:最原始的想法就是枚举起点终点,然后遍历乘一遍。最终MAX就是答案。但是这个做法的复杂度达到了O(n^3),很难接受,所以有dp的解法。dp分析:考虑集合的表示:f[i], g[i]f[i]表示以i为终点,左侧连续且乘积最大的值是多少g[i]表示以i为终点,左侧连续且乘积最小的值是多少因为在枚举终点,最优解一定是某个终点向左连续乘积得到的,所以一定可以得到答案。所以f[k]之中最大的那个就是答案。考虑状态的计算:我们有了f[i-1],原创 2020-07-30 21:38:30 · 240 阅读 · 0 评论 -
LeetCode 91. 解码方法(java代码和思路分析)
题目传送门解题流程解题思路:代码实现:解题思路:动态规划问题(dp)。一个字母对应了唯一的编码,所以正着编码一定是唯一的。但是反过来就不唯一了。我们要找一共有多少种方法反编码dp分析:考虑集合的表示:f[i]一维集合,代表着前i个数字一共有多少种反编码方式考虑状态的计算:编码数字一共只有1到26,所以编码只有一位和两位。如果是一位的话,数字介于1~9之间。没有0!!如果是两位的话,数字介于10~26之间从前遍历,当前第i位。这样我们就可以分出两种情况:如果当前位s[i原创 2020-07-30 18:10:15 · 138 阅读 · 0 评论 -
LeetCode 151. 翻转字符串里的单词(java代码和思路分析,模拟题)
题目传送门解题流程解题思路:代码实现:解题思路:先把字符串左右的空格全删掉。在最右侧加一个空格,用来保证遍历完时最后一个单词也可以操作完。将每个单词放入集合中。倒着加回来即可代码实现:class Solution { public String reverseWords(String s) { // 去掉左右空格 s.trim(); s += " "; // 将每个单词都放入这个数组 List<S原创 2020-07-30 15:47:06 · 89 阅读 · 0 评论 -
LeetCode 72. 编辑距离(java代码和思路分析)
题目传送门解题流程解题思路:代码实现:解题思路:这道题很经典的dp问题。首先我们只有三种操作:删除一个字符添加一个字符修改一个字符我们需要用最少的步数将word1转成word2。我们可以发现以下规律:从word1变成word2不可能是先删掉一个字符,再把这个字符加回来,这样平白无故的多出了两次操作,肯定不是最少步数我们操作的顺序并不影响结果,比如abcd编程ace,需要删除bd添加e,这三步我们先做哪一步结果都是一样的dp的要素:考虑集合的表示:f[i][j], 用这个原创 2020-07-30 15:30:41 · 171 阅读 · 0 评论 -
LeetCode 71. 简化路径
第一个leetcode题解,太久没做题上来就脑淤血。。。解题流程解题思路:代码实现:解题思路:这道题要求我们简化路径,只是一道模拟题,注意以下细节即可:首先格式不统一,我们需要在路径结尾加一个"/",比如"/hello"我们改成"/hello",这样可以让我们最后一个字符串能够读完(读取一个单词是要判断是否到了"/")每读完一个字符串,分为4种情况:字符串为".",代表当前路径字符串为"", 代表斜杠连起来了,还是当前路径(只有"/hello//jerry/"这种斜杠连读才会产生空字符串)原创 2020-07-30 11:47:39 · 114 阅读 · 0 评论