![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode
记录自己的刷题记录,犯的错误,总结经验等
CervoLu
这个作者很懒,什么都没留下…
展开
-
24. 两两交换链表中的节点
【代码】24. 两两交换链表中的节点。原创 2023-07-11 02:30:25 · 58 阅读 · 0 评论 -
23合并k个升序链表
学习了优先权队列的使用方法,引入头文件,写一个比较函数,可以当作最小堆、最大堆使用。原创 2023-07-06 23:50:11 · 89 阅读 · 0 评论 -
22括号生成
【代码】22括号生成。原创 2023-07-02 15:06:04 · 59 阅读 · 0 评论 -
70 746爬楼梯
两题都是基础dp题#include<iostream>#include<vector>using namespace std;class Solution {public: int climbStairs(int n) { if (n == 1)return 1; if (n == 2)return 2; vector<int>dp(n + 1); dp[1] = 1; dp[2] = 2;原创 2022-03-27 11:27:54 · 42 阅读 · 0 评论 -
509 1137斐波那契数列
第一题,常规斐波那契数列,学到了很多东西,书上的递归其实是一种效率很低的做法,因为他重复计算了很多子问题,所以用自顶向下的备忘录法或者自底向上的动态规划法效果更好。#include<iostream>#include<vector>using namespace std; class Solution {//传统递归,耗时大public: int fib(int n) { if (n == 0)return 0; else if (原创 2022-03-21 22:53:31 · 211 阅读 · 0 评论 -
19移除链表的倒数第N个结点
这题可以用快慢指针的方法,快指针到终点时,慢指针应该在删除结点的前一个结点,为了防止删除头节点,应该在头节点前面新建一个before结点,返回的时候也应返回before->next,这题题解里还用了二次遍历、用栈来解决两种方法,当然还是快慢指针是最好的。#include<iostream>#include<vector>#include<algorithm>using namespace std;struct ListNode { int val;原创 2021-11-29 21:38:41 · 139 阅读 · 0 评论 -
18 四数之和
类似于三数之和,首先排序,确定前两位之和用双指针确定后两位,注意重复问题的解决。#include<iostream>#include<vector>#include<algorithm>using namespace std;class Solution {public: vector<vector<int>> fourSum(vector<int>& nums, int target) {原创 2021-11-29 15:47:49 · 54 阅读 · 0 评论 -
235二叉树的最近公共祖先
因为是从根节点开始的,如果root在pq之间,那root就是最近公共祖先。#include<iostream>#include<queue>#include<vector>#include<unordered_set>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0),原创 2021-11-26 22:36:01 · 349 阅读 · 0 评论 -
653两数之和IV
二叉搜索树中的两数之和,通过遍历得到一个vector数组,转化出1两数之和问题。#include<iostream>#include<queue>#include<vector>#include<unordered_set>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0原创 2021-11-26 22:03:07 · 336 阅读 · 0 评论 -
98验证二叉搜索树
验证的方法并不是每个节点都大于左边的,小于右边的,而是每个节点必须大于左子树每一个节点,小于右子树每一个节点。方法一是给每个节点赋予一个上限和一个下限,每次判断节点值是否在界内。方法二是看了一篇题解,根据二叉搜索树中序遍历后就是递增数列的原理进行。这个递归用的很妙#include<iostream>#include<queue>#include<vector>using namespace std;struct TreeNode { int val;原创 2021-11-26 20:48:17 · 425 阅读 · 0 评论 -
701 二叉搜索树中的插入操作
二叉搜索树的插入,只要到规定的节点位置新建一个叶节点就可以了。#include<iostream>#include<queue>#include<vector>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {}原创 2021-11-26 19:52:09 · 235 阅读 · 0 评论 -
700二叉树中的搜索
根据二叉树的性质,很好判断#include<iostream>#include<queue>#include<vector>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) :原创 2021-11-26 19:21:42 · 288 阅读 · 0 评论 -
112路径总和
刚开始没注意必须是根节点到叶节点,所以必须多一个是不是叶节点的判定,程序整体用递归实现。#include<iostream>#include<queue>#include<vector>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nu原创 2021-11-26 19:07:47 · 48 阅读 · 0 评论 -
226反转二叉树
核心在于,如果一个节点的子节点的子节点都已经交换顺序了,那么就交换该节点的左右子节点。#include<iostream>#include<queue>#include<vector>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nul原创 2021-11-26 18:41:23 · 56 阅读 · 0 评论 -
101对称二叉树
每次比较两个对称指针节点的值,可以设置两个指针,他们每次都一个向左,一个向右,每次递归来实现。#include<iostream>#include<queue>#include<vector>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right原创 2021-11-26 18:14:26 · 423 阅读 · 0 评论 -
104二叉树的深度
二叉树的深度用深度优先搜索可以很快的写出来#include<iostream>#include<queue>#include<vector>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(原创 2021-11-24 22:51:52 · 168 阅读 · 1 评论 -
102二叉树的层序遍历
层序遍历通过一个 队列实现,循环直到队列为空为止#include<iostream>#include<queue>#include<vector>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNo原创 2021-11-23 23:49:45 · 60 阅读 · 1 评论 -
145 二叉树的后序遍历
#include<iostream>#include<vector>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullpt原创 2021-11-22 20:17:29 · 40 阅读 · 0 评论 -
94二叉树的中序遍历
和前面前序遍历差不多#include<iostream>#include<vector>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), r原创 2021-11-22 20:06:08 · 38 阅读 · 0 评论 -
144二叉树的前序遍历
用递归就按书上的来就行,题解也提供了迭代的方法,太麻烦。#include<iostream>#include<vector>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x)原创 2021-11-22 20:02:14 · 33 阅读 · 0 评论 -
232用栈实现队列
我有一个问题一开始没反应过来,就是s2的栈顶一定是队列队头的。如果s2空了,s1会把全部元素转到s2#include<iostream>#include<stack>using namespace std;class MyQueue {private: stack<int>s1, s2; void intoout() { while (!s1.empty()) { s2.push(s1.top());原创 2021-11-21 15:58:19 · 437 阅读 · 0 评论 -
20有效的括号
用栈来处理我提一次提交没通过是因为忽略了栈为空时,输入一个右括号的情况#include<iostream>#include<stack>#include<unordered_map>using namespace std;class Solution {public: bool isValid(string s) { stack<char>sstack; unordered_map<char, cha原创 2021-11-21 14:40:20 · 153 阅读 · 0 评论 -
83删除排序链表中的重复元素
没看清题目,题目的链表是升序的,所以重复元素都是连续出现的,不应该用这个set的,直接判断自身和下一个就好了。#include<iostream>#include<unordered_set>using namespace std;struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), n原创 2021-11-21 13:52:57 · 40 阅读 · 0 评论 -
206反转列表
递归和迭代两种方法,我觉得就链表而言迭代更有训练价值#include<iostream>using namespace std;struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x, ListNode *next) : val(x原创 2021-11-20 19:57:09 · 295 阅读 · 0 评论 -
203移除链表元素
要么递归要么迭代,但是题解的递归感觉永远写的很简单#include<iostream>using namespace std;struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x, ListNode *next) : val(x)原创 2021-11-20 19:29:19 · 36 阅读 · 0 评论 -
21合并两个有序链表
我写的复杂了,主要原因是没有意识到一个问题,就是链表的链接只需要接一个就行了,而不需要一个节点一个节点的去接。题解有两种方法,迭代和递归#include<iostream>using namespace std;struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {}原创 2021-11-20 15:11:10 · 718 阅读 · 0 评论 -
141环形链表
我用的是一个常见的方法,就是用一个集合记录节点是否已经被记录过。题解用了一个龟兔赛跑方法,又见Floyd判圈算法,就是如果起点在前面的快指针如果追上了慢指针,说明有环。#include<iostream>#include<unordered_set>using namespace std;struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}原创 2021-11-20 13:25:22 · 161 阅读 · 0 评论 -
242有效的字母异位词
这题和383赎金信有点像我用了两个哈希表,题解只用了一个,然后对另一操作时,使用–操作,还挺有启发性的。#include<iostream>#include<unordered_map>using namespace std;class Solution {public: bool isAnagram(string s, string t) { unordered_map<char, int>smap; unordere原创 2021-11-18 22:07:57 · 166 阅读 · 0 评论 -
383赎金信
问题相当于一个字符串的字符是否是另一个字符串字符串字符的子集。我用了两个哈希表统计字符出现的次数。#include<iostream>#include<unordered_map>using namespace std;class Solution {public: bool canConstruct(string ransomNote, string magazine) { unordered_map<char, int>rn;原创 2021-11-18 21:15:24 · 70 阅读 · 0 评论 -
387字符串中的第一个唯一字符
我用的方法是遍历两次,用一个哈希表存储每个字符出现的次数题解用了一个哈希表存储字符索引还有一个队列的方法,因为我对容器还不熟悉,有空再写#include<iostream>#include<unordered_map>using namespace std;class Solution {public: int firstUniqChar(string s) { unordered_map<char,int>map;原创 2021-11-18 12:30:26 · 50 阅读 · 0 评论 -
73矩阵置零
用一个m+n的空间消耗可以轻松处理,只要记录每一行每一列是否有0就行了,题解中给出了空间复杂度更低的处理方式,把第一行和第一列作为记录位置,但是要标记位记录第一行第一列本身是否有0.。还可以只把第一列是否有0记录,第一行在行里最后更新,因为如果第一行作为标记行,如果先更新会影响别的位的更新#include<iostream>#include<vector>using namespace std;class Solution {public: void setZer原创 2021-11-18 11:39:02 · 168 阅读 · 0 评论 -
36有效的数独
我用三个9*9的矩阵存储9行,9列,9个box里,1~9出现过的情况,值得注意的是,board[i][j]是char各式,想要其作为下标索引,需要做这步处理row[i][board[i][j]-'0'-1] ++;完整代码如下#include<iostream>#include<vector>using namespace std;class Solution {public: bool isValidSudoku(vector<vector<ch原创 2021-11-18 10:32:18 · 50 阅读 · 0 评论 -
17电话号码的字母组合
看到所有组合就应该明白这题考察了搜索算法,可以使用DFS或者BFS数字对应字母用了一个哈希表实现,主体部分看了题解,自己加了点注释,主要之前没怎么用过DFS。#include<iostream>#include<vector>#include<unordered_map>using namespace std;class Solution {public: vector<string> letterCombinations(string原创 2021-11-17 11:18:31 · 65 阅读 · 0 评论 -
118杨辉三角
考察了一些二维vector的使用方法,我和题解写的差不多,题解里用了一个resize函数调整vector大小。#include<iostream>#include<vector>using namespace std;class Solution {public: vector<vector<int>> generate(int numRows) { vector<vector<int>>ans(num原创 2021-11-16 21:27:20 · 209 阅读 · 0 评论 -
566重塑矩阵
这题思路我也想到了,基本和题解一样,就是有一句二维vector的初始化不会写,找了一下写法vector<vector<int>>ans(r,vector<int>(c));//这句没写出来,卡半天核心代码是这句 ans[i / c][i % c] = mat[i / n][i % n];完整代码如下#include<iostream>#include<vector>using namespace std;class Solut原创 2021-11-16 19:47:36 · 201 阅读 · 0 评论 -
121买卖股票的时机
我最开始想把股价数组转成差价数组,这就成了53最大子序和问题了,看了题解发现只要找个最大值和最小值就行了,又做麻烦了。#include<iostream>#include<vector>using namespace std;class Solution {public: int maxProfit(vector<int>& prices) { int n = prices.size(); int ans=0;原创 2021-11-15 19:54:03 · 537 阅读 · 0 评论 -
350两个数组的交集
我写了有点麻烦了,用了两个哈希表,实际上一个就够了,题解的两个方法是哈希表和排序+双指针,都挺有收获的#include<iostream>#include<vector>#include<unordered_map>#include<algorithm>using namespace std;//自己写的, 两个哈希表,太麻烦了class Solution {public: vector<int> intersect(vec原创 2021-11-15 19:33:28 · 361 阅读 · 0 评论 -
53最大子序和
用一个变量记录最大的子序和,思路如下:如果我是后面一个数,如果前面一个数小于零,我不如放弃前面的序列只上我自己#include<iostream>#include<vector>using namespace std;class Solution {public: int maxSubArray(vector<int>& nums) { int maxnum = INT_MIN; int x = 0;原创 2021-11-14 15:39:02 · 334 阅读 · 0 评论 -
217存在重复元素
判断数组中的重复元素,一个哈希表实现#include<iostream>#include<vector>#include<unordered_set>using namespace std;class Solution {public: bool containsDuplicate(vector<int>& nums) { unordered_set<int>map; for (int i原创 2021-11-14 15:16:56 · 201 阅读 · 0 评论 -
16最接近的三数之和
参考15三数之和的想法,使用排序加双指针的方法。#include<iostream>#include<vector>#include<algorithm>using namespace std;class Solution {public: int threeSumClosest(vector<int>& nums, int target) { int n = nums.size(); int ans原创 2021-11-13 23:44:14 · 349 阅读 · 0 评论