![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
_amnesia_
这个作者很懒,什么都没留下…
展开
-
LeetCode 2389. 和有限的最长子序列
简单题,对于“子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。文章所给出的这句话的意思是即可以随意的更改顺序也不会影响结果,那么就对数组从小到大排列,一个一个判断,看满足要求的最长序列。原创 2023-03-17 19:47:09 · 72 阅读 · 0 评论 -
leetcode 78. 子集
题解dfs+ 剪枝?回溯从当前位置开始搜索,有两种选择,要 或者 不要 当选择的次数和数组的次数相同的时候就是递归终止的条件。代码class Solution {public: vector<int>t; vector<vector<int>> ans; //dfs + 剪枝 void dfs(int cur, vector<int>&nums){ //递归结束原创 2021-06-20 19:43:09 · 86 阅读 · 0 评论 -
leetcode 76. 最小覆盖子串
题解双指针还是有一些逻辑的左右两个指针分别记录左右区间范围,count 记录当前窗口是否满足条件,如果满足条件缩小窗口范围,找到当前满足条件的最小范围,之后记录结果,然后左指针右移,继续查找。这里还给出了s.substr 的使用代码如下:s1=S.substr(1,3);//在字符串S中,复制从位置1开始长度为3的字符串;代码class Solution {public: string minWindow(string s, string t) { vector原创 2021-06-19 09:49:15 · 173 阅读 · 0 评论 -
leetcode 75. 颜色分类
题解sort 排序出来的结果就是从小到大代码class Solution {public: void sortColors(vector<int>& nums) { sort(nums.begin(),nums.end()); }};原创 2021-06-18 10:28:20 · 61 阅读 · 0 评论 -
leetcode 72. 编辑距离
题解dp 动态规划 很经典的一道题目dp[i][j] 表示 word1 到 i 位置转换为 word2 到 j 位置的最小步数当 word1[i] == word2[j] 时,dp[i][j] = dp[i-1][j-1]当 word1[i] != word2[j] 时,dp[i][j] = min(dp[i - 1][j - 1] , dp[i-1][j],dp[i][j-1]) + 1其中还包含初始化操作当word2字符串为空,word1变为word2只需要删除当时存在的字符即可当word原创 2021-06-17 18:55:33 · 73 阅读 · 0 评论 -
leetcode 64. 最小路径和
题解呀 独立做出来的,果然 熟能生巧还和昨天的那个一样,动态规划dp[i][j] 表示从左上角走到i,j点时最短距离,那么dp[i][j] = grid[i][j] + min(dp[i -1][j],dp[i][j-1])初始化是第一行第一列的最短路径就是到这点时这行和这列的数的总和。有什么不对的或者简便的算法欢迎指正~代码class Solution {public: int minPathSum(vector<vector<int>>& grid原创 2021-06-14 09:52:42 · 69 阅读 · 0 评论 -
leetcode 62. 不同路径
题解动态规划f(i,j) 表示从左上角到(i,j) 点的路径和,那么走到ij 的前一点到ij 有两种方式那么 f(i,j) = f(i-1,j) + f(i,j-1)其中初始化 f(0,0) = 1,f(i,0) = 1,f(0,j) = 1,因为从左上角走到这几点的位置只有一条路径。代码class Solution {public: int uniquePaths(int m, int n) { vector<vector<int>> f(m,原创 2021-06-13 08:48:14 · 60 阅读 · 0 评论 -
leetcode 56. 合并区间
题解双指针需要把区间先排一下序左指针指向区间最左边的位置,右指针指向区间最右边的位置,t 来控制上个区间最右边的位置如果下个区间可以和上个之前的合并,那么进行更新,知道到这个位置没有可以合并的区间为止,之后更新左指针继续进行看这个区间可以合并的最大范围。如果不理解的可以先看一遍代码欢迎指正和提问~代码class Solution {public: vector<vector<int>> merge(vector<vector<int>>原创 2021-06-09 17:00:07 · 54 阅读 · 0 评论 -
leetcode 55. 跳跃游戏
题解题目还是比较好懂的,贪心算法,只要能满足一个步骤跳到最后就可以。即当存在满足两个条件的这个就可以跳到最后一个。1.可以跳到当前位置2.在当前位置时,可以跳的最远具体大于等于最后一个。代码class Solution {public: bool canJump(vector<int>& nums) { int n = nums.size(); int maxn = 0; for(int i = 0; i < n原创 2021-05-04 14:28:37 · 72 阅读 · 0 评论 -
leetcode 53. 最大子序和
题解简单的动态规划吧算是还是比较简单的题目首先计算sum的值,如果和的值大于0那么这一段的和就对后面那个数有用,否则,就重新从下一个数开始,然后取最大值。代码class Solution {public: int maxSubArray(vector<int>& nums) { int n = nums.size(); int ans = nums[0],sum = 0; for(int i = 0; i < n;原创 2021-05-02 10:52:45 · 62 阅读 · 0 评论 -
leetcode 49. 字母异位词分组
题解题目还是比较容易理解的,主要是map的应用,用排序好的map作为键,然后这个键索引着所有着排序之后和他相同的string代码class Solution {public: vector<vector<string>> groupAnagrams(vector<string>& strs) { unordered_map<string, vector<string>> mp; for(str原创 2021-05-01 10:43:33 · 61 阅读 · 0 评论 -
leetcode 48. 旋转图像
题解其实算是思维题?如果题目不说只在这个矩阵上来用完全可以在开辟一个矩阵来进行填充所以这道题的难点就在于只能在这个矩阵上进行交换所以只能进行矩阵里元素的交换而不能进行操作等。然后就想如何进行交换呢然后就要分步骤进行交换思路:先上下进行水平翻转然后在进行对角线翻转即可。可以尝试一下然后记住就可,其他的翻转也可按照相同的思路进行。代码class Solution {public: void rotate(vector<vector<int>>&原创 2021-04-24 15:23:39 · 62 阅读 · 0 评论 -
leetcode 46. 全排列
题解水题? 主要是c++ 自带全排列函数,所以很好解决,记住怎么应用那个就可以。然后就是需要注意的是在排列过程中先sort一下,否则就会从当前那个值之后进行排列,排列的不全。代码class Solution {public: vector<vector<int>> permute(vector<int>& nums) { int n = nums.size(); vector<vector<int>原创 2021-04-23 17:03:26 · 59 阅读 · 0 评论 -
leetcode 42. 接雨水
题解方法一:暴力,从左到右遍历一次,当前位置所能接的最大雨水的值为当前位置的左边的最大值和当前位置的右端的最大值的最小值减去当前位置的值。方法二:先存储好每个位置的左边最大值和右边最大值,其余步骤和方法一一样,他俩应该是互补的,一个时间复杂度高,一个空间复杂度高。方法三:堆栈代码方法一class Solution {public: int trap(vector<int>& height) { //暴力大法好hhh,什么叫做困难题。。。什么是快乐星球原创 2021-04-16 16:16:25 · 101 阅读 · 0 评论 -
leetcode 39. 组合总和
题解求目标解的组合数,dfs很容易解出。对于每一个数,都有两种办法 选择 或者不选择来选择下一个,选择的话在是否继续选择还是不选择选择下一个。官方题解写的很清楚官方题解代码class Solution {public: void dfs(vector<int>&candidates,int target,vector<vector<int>>&ans,vector<int>& combine,int idx){原创 2021-04-15 11:17:29 · 64 阅读 · 0 评论 -
leetcode 34. 在排序数组中查找元素的第一个和最后一个位置
题解昨天,没做,今天要做两道题了。。。。很简单 二分 之前JAVA老师也让用JAVA写过,虽然忘了,但是思路还是一样的。代码class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> a; int n = nums.size(); if(n == 0){原创 2021-04-15 09:56:37 · 59 阅读 · 0 评论 -
leetcode 33. 搜索旋转排序数组
题解看评论说不知道这道题的意义所在,emm确实有的题暴力就可以解决主要看思路什么的吧 二分的话效率会更高,所以这里给出两种解法,大家还可以联系一下二分算法。二分的思路说一下吧,要不然可能不太理解先判断左右两边是否为有序数组,不管怎么分,左右两边必有一个有序数组,有过左边有序,就判断目标值是否在左区间的范围内,如果在的话那就缩小,不在的话那么一定就在右边如果右边有序,原理和上述方法相同,来判断缩小的区间范围。先找到有序的区间范围然后先判断有序的区间段否则为另一部分,这样判断比较方便。不太理解的话原创 2021-04-13 10:00:34 · 55 阅读 · 0 评论 -
leetcode 32. 最长有效括号
题解i’m coming~终于又回来了~动态规划难想不到dp[i] 表示以第i 个字符为结尾的最长连续的括号长度如果 s[i] = ‘(’那么dp[i] = 0如果 s[i] = ‘)’那么就需要分情况来判断如果 s[i - 1] =’(’那么 dp[i] = dp[i - 2] + 2 这里需要满足 i - 2 >= 0 如果不满足的话那么dp[i] = 2。如果s[i - 1] = ‘)’那么需要判断 第 i - dp[i - 1] - 1 这个位置是否为‘(’ ,如果原创 2021-04-12 16:15:08 · 53 阅读 · 0 评论 -
leetcode 22. 括号生成
题解这个思路绝了递归利用剩余的左括号数和右括号数当左括号数和右括号都为0时,那么存在一个正确组合那么正确组合的条件有哪些呢(1)剩余的左右括号相同,那么只能放置左括号,不能放置右括号(2)剩余的左括号小于右括号,那么既可以放置左括号 也可以放置右括号,那么先放置左括号,注意放置的时候注意长度,不要忘了剩余的左括号不能小于零然后也可以进行放置右括号,放置右括号不需要满足什么条件,因为前面已经有了大条件,即左括号的剩余数小于右括号的剩余数(3)剩余的左括号 大于右括号 那么一定没有符合条件的,原创 2021-03-21 11:05:37 · 41 阅读 · 0 评论 -
leetcode 21. 合并两个有序链表
题解链表简单题两个有序链表的合并问题新建一个有头指针的链表,然后新建一个指针指向他,在l1 和 l2 中进行移动,l1的数字小,那么把l1加进去,后移一个,l2同理当出现一个为空时后面的也不需要进行比较了。直接向后填充即可。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(n原创 2021-03-20 09:43:19 · 54 阅读 · 0 评论 -
leetcode 20. 有效的括号
题解数据结构典型的堆栈。应该还是比较经典的先放入一个字符,然后和下一个比较是否成对,成对的话之前的弹出,没成对的话这个也放入堆栈。需要注意的是1.可以进行一个先行判断 可以判断字符串的长度是否是偶数,是奇数的话直接return false2.还有注意一开始堆栈为空的情况,那么需要判断是否为空,为空的话先放进去一个,要不然也没有办法进行匹配。代码class Solution {public: bool isValid(string s) { //暴力堆栈,谁让这里就给原创 2021-03-20 08:57:55 · 45 阅读 · 0 评论 -
leetcode 19. 删除链表的倒数第 N 个结点
题解普通链表操作,暴力解决,没有实现一次遍历就可以的方法首先遍历一次找出链表的长度,然后 先设定一个空节点 长度-n + 1的下一个即为要删掉的那个节点代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : va原创 2021-03-18 11:16:57 · 89 阅读 · 0 评论 -
leetcode 17. 电话号码的字母组合
题解又是双指针 of course no回溯法把数字和相应的字符一一对应比如当第一个数字对应的第一个字符,然后就索引下一个数字,查找他所对应的字符,这样就可以把字符一一对应完其实思路还是比较简单地,感觉暴力应该也可以代码class Solution {public: vector<string> letterCombinations(string digits) { vector<string> combinations; if原创 2021-03-17 11:16:44 · 54 阅读 · 0 评论 -
leetcode 15. 三数之和
题解双指针感觉就是对题目的深度理解,首先遍历a 那么就是找 b + c = -a 的情况。首先不能进行暴力解决,所以要有一定的简化,b 代表左指针,c 代表右指针,对于去掉重复的,需要先对数组从小到大排序,看到重复的直接过掉即可,这样的话,b 从左向右变大,c 从右向左遍历,保持平衡,最后当两个数同一位置的时候那么遍历结束。先打了一遍官方代码,感觉逻辑还是有些混乱的,建议看第二份代码,还是比较清晰的。代码class Solution {public: vector<vector&原创 2021-03-16 10:12:30 · 57 阅读 · 0 评论 -
leetcode 11. 盛最多水的容器
题解双指针一开始想到了,首先先看给的数据的大小,一看数据就知道不能用0(n^2)来解决,不能暴力解决。想到了双指针,但没想到左移右移的条件,下次还是需要要仔细思考一下子的。左右指针分别指在最左边和最右边左指针右移的条件:是当左指针的那个高度小于右指针的那个高度。原因:当左指针高度小于右指针,那么右指针左移的任何一个矩形的面积都要比当前的要小。右指针左移的条件:是当左指针的那个高度大于右指针的那个高度。原因:当左指针那个高度大于右指针那个高度,右指针和左指针右移的任何一个高度比当前的矩形面积都原创 2021-03-15 09:42:38 · 48 阅读 · 0 评论 -
leetcode10. 正则表达式匹配
题解动态规划这道题还是相对来说比较难一些的,动态规划,其实就是剪枝搜索,搜索s的前i 个字符和 p 的前j 个字符是否相匹配题解在代码的注释中详细给出,建议打一遍代码仔细理解一下,要把情况考虑全。。。感觉思路真的是挺难想的。。。class Solution {public: bool isMatch(string s, string p) { int m = s.length() + 1; int n = p.length() + 1; v原创 2021-03-14 10:53:33 · 75 阅读 · 0 评论 -
leetcode 5. 最长回文子串
题解其实暴力也可以解的,但是觉得会比动态规划还要麻烦本文采用的为动态规划解法,我觉得还是比较容易看懂的。dp方程如下判断i - j是否为回文串的dp方程如下dp[i][j]={1,if i = js[i]==s[j],else if j - i == 1s[i]==s[j]ands[i+1][j−1],else dp[ i ][ j ] = \begin{cases} 1, & \text {if $原创 2021-03-11 11:17:26 · 48 阅读 · 0 评论 -
leetcode 4. 寻找两个正序数组的中位数
题解说是困难题,其实没有那么的麻烦,因为c++里面自带的就可以解决。首先把第二个数组里面的元素加入到第一个数组中去,然后用自带的sort进行排序,然后找到中位数即可。注意结果可能是小数,记得改为double。代码class Solution {public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int n1 = nums1.s原创 2021-03-10 09:32:24 · 49 阅读 · 0 评论 -
LeetCode 3. 无重复字符的最长子串
题解1.滑动窗口2.思路:仍然是左右两个指针,左指针指向最左边的那个数字,右指针指向之前无重复的那个数的最后那个数,左指针从第一个数遍历到最后一个数,找从左指针开始的最大无重复子串,然后取最大值。这里需要注意的是第一个无重复最长子串,当左指针右移的时候,他仍是一个无重复子串,只需让右指针接着向后遍历即可。只要不出现重复的即可。所以需要用unordered_set 来存储现在已经存在的字符来判断后续能否加入字符。注意终止条件。代码class Solution{public: int l原创 2021-03-09 09:44:31 · 70 阅读 · 0 评论 -
leetcode 2. 两数相加
题解考察数据结构链表指针首先确定题目给出的逆序,即第一个数是个位,即从左向右相加即可,该进位进位。遇到空补0,因为可能一个数加完,另一个数还有,所以不能为空。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) :原创 2021-03-08 16:44:18 · 75 阅读 · 0 评论 -
leetcode 1. 两数之和
题解从这次开始要刷Hot 100 emmm由于时间关系而且题库题目太多太杂就先不刷每日一题了。。。目标每天弄会一道题以及相关的知识点。然后每周把当时不是自己打代码的题在做一遍,希望能实现。。。不实现的话那就需要全做完在刷一遍了。。。。好的 言归正传 说一下这个题解首先进行复杂度分析 n < 1000 可见O(n^2)可以,即可以暴力,需要注意的是:1.每个数字不可以重复使用2.每个数据只有一个结果3.返回的是所在数字的下标代码class Solution {public:原创 2021-03-07 22:06:01 · 82 阅读 · 0 评论 -
leetcode 867. 转置矩阵
题解水题。。。新建一个二维数组,把转置后的内容赋值到相应的位置即可。代码class Solution {public: vector<vector<int>> transpose(vector<vector<int>>& matrix) { int n = matrix.size(); int column = matrix[0].size(); vector<vector<i原创 2021-02-25 22:24:15 · 61 阅读 · 0 评论 -
leetcode 832. 翻转图像
题解题目描述很清楚,按照题目说的来,先水平翻转,在反转。水平翻转利用自带reverse即可,翻转直接和1异或即可。代码class Solution {public: vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) { int n = A.size(); for(int i = 0; i < n; i++){原创 2021-02-24 11:15:28 · 62 阅读 · 0 评论 -
leetcode 1052. 爱生气的书店老板
题解题目还是比较容易读懂的,根据题目写出代码即可,滑动窗口首先求出全是0的那个部分解,然后在找到部分1中的最大值。右指针+1,当窗口长度超过x,那么先取最大值,然后右指针加一,左指针加1然后减去之前左指针的数值,接着计算。如果看不太懂的话可以边看代码边看题解,这样还是比较容易些的。还有需要注意的是这个代码最后没有比较最后一次的maxn 和sum 的值所以仍需要最后比较一次。代码class Solution {public: int maxSatisfied(vector<int原创 2021-02-23 14:05:33 · 82 阅读 · 0 评论 -
leetcode 1004. 最大连续1的个数 III
题解还是滑动窗口跟之前做的题目其实是有些类似的,需要进行题目转换,转化为寻找包含k个0的最大连续子串。然后题目就变得简单了左右两个指针,右指针一直向右走,当不满足<= k个0的条件,那么需要左指针右移,并且判断当前存在的0的个数。代码class Solution {public: int longestOnes(vector<int>& A, int K) { int n = A.size(); int left = 0,res原创 2021-02-19 10:55:16 · 200 阅读 · 0 评论 -
leetcode 566. 重塑矩阵
题解这次又是简单题 题目还是比较简单的,就喜欢做简单题!也需要一定的思维吧题解官方题解代码class Solution {public: vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) { if(nums.empty()){ return nums; } in原创 2021-02-17 09:55:26 · 88 阅读 · 0 评论 -
leetcode 561. 数组拆分 I
题解简单题 - 思维题 -规律题题目比较简单而且容易读懂其实只要给出的测试用例够多也可以发现其中的规律。就是从小到大排序,每次都取每对中的第一个数也就是最小的那个数。代码class Solution {public: int arrayPairSum(vector<int>& nums) { int n = nums.size(); int d = n/2; int ans = 0; sort(nums原创 2021-02-16 09:34:43 · 67 阅读 · 0 评论 -
leetcode 485. 最大连续1的个数
题意简单题,题目通俗易通,直接按照题目要求即可。但仍需要注意如果最后是1不是0仍需在取一次最大值。题解class Solution {public: int findMaxConsecutiveOnes(vector<int>& nums) { int n = nums.size(); int maxn = 0; int num = 0; for(int i = 0; i < n; i++){原创 2021-02-15 10:24:40 · 57 阅读 · 0 评论 -
leetcode 992. K 个不同整数的子数组
题解滑动窗口动态规划 恰好K个组成为 最多K个组成 - 最多K - 1个组成如何计算最多K个组成:当从1个增加为2个,增加的数目为新的子数组的长度。代码class Solution {public: int GetMostDistinct(vector<int>& A, int K) { unordered_map<int,int>mp; int left = 0,right = 0,ret = 0; whi原创 2021-02-09 10:50:04 · 62 阅读 · 0 评论 -
leetcode 978. 最长湍流子数组
题解双指针其实就是暴力吧,想好各种可能的情况,左右两个·指针,如果满足,右指针右移一个,如果不满足,左指针要变为右指针重新计算。注意的是左右指针相同的情况下,需要判断和下一个数是否相同,如果相同那么左指针和右指针仍需要右移一次,如果不相同那么仍满足条件,只需要右指针右移即可。代码class Solution {public: int maxTurbulenceSize(vector<int>& arr) { int n = arr.size();原创 2021-02-08 10:40:26 · 66 阅读 · 0 评论