top200
top200刷题
无问东西 听从我心
这个作者很懒,什么都没留下…
展开
-
104. 二叉树的最大深度
方法一:dfsclass Solution {public: int maxDepth(TreeNode* root) { if (root == nullptr) return 0; return max(maxDepth(root->left), maxDepth(root->right)) + 1; }};作者:LeetCode-Solution链接:https://leetcode-cn.com/problems/maximu原创 2022-02-16 11:09:46 · 409 阅读 · 0 评论 -
76. 最小覆盖子串(滑动窗口)
滑动窗口思路用一个字典need来表示当前滑动窗口中需要的各元素的数量count记录所需元素的总数量,当我们碰到一个所需元素c,不仅need[c]的数量减少1,同时count也要减少1class Solution {public: string minWindow(string s, string t) { vector<int> need(128,0); int count = 0; for(char c : t)原创 2022-02-10 13:55:34 · 606 阅读 · 0 评论 -
151. 翻转字符串里的单词
这里空间复杂度o(n)class Solution {public: string reverseWords(string s) { int i = s.size() - 1; string ans; while(i >= 0) { int c = 0; while(i >= 0 && s[i] == ' ') --i; while(原创 2022-02-09 14:47:21 · 815 阅读 · 0 评论 -
105、从前序与中序遍历序列构造二叉树
方法一:递归class Solution {private: unordered_map<int, int> index;public: TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>& inorder, int preorder_left, int preorder_right, int inorder_left, int inorder..原创 2022-02-08 15:02:25 · 117 阅读 · 0 评论 -
72. 编辑距离(困难)
class Solution {public: int minDistance(string word1, string word2) { vector<vector<int>>dp(word1.size()+1,vector<int>(word2.size()+1,0)); for(int i =1 ;i<=word1.size();i++){ dp[i][0] = i; }..原创 2022-01-29 16:05:40 · 553 阅读 · 0 评论 -
148. 排序链表(归并排序细节,复杂)
归并和快排的方法都要掌握题目要求时间空间复杂度分别为O(nlogn)和O(1)时间复杂度是 O(nlogn) 的排序算法包括归并排序、堆排序和快速排序(快速排序的最差时间复杂度是 O(n^2),其中最适合链表的排序算法是归并排序。归并排序基于分治算法。最容易想到的实现方式是自顶向下的递归实现,考虑到递归调用的栈空间,自顶向下归并排序的空间复杂度是O(logn)。如果要达到 O(1)的空间复杂度,则需要使用自底向上的实现方式。解答一:归并排序(递归法,空间复杂度是O(logn))/** * D原创 2022-01-29 10:03:26 · 1176 阅读 · 1 评论 -
144. 二叉树的前序遍历(前中后序递归+迭代总结)
迭代和递归的方法!二叉树遍历详细解释遍历二叉树的方法合集94 二叉树的中序遍历144 二叉树的前序遍历145 二叉树的后序遍历一、递归前序遍历:class Solution {public: void traversal(TreeNode* cur, vector<int>& vec) { if (cur == NULL) return; vec.push_back(cur->val); // 中 t原创 2022-01-28 13:49:14 · 176 阅读 · 0 评论 -
2. 两数相加
注意细节!!/** * Definition for singly-linked list. * 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), nex原创 2022-01-27 14:45:55 · 592 阅读 · 0 评论 -
19. 删除链表的倒数第 N 个结点
注意两个用例[1,2,3,4,5]2[1]1/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode原创 2022-01-26 17:00:47 · 389 阅读 · 0 评论 -
82. 删除排序链表中的重复元素 II
重点:有序链表,所以,一个节点的值出现不止一次,那么它们必相邻。方法一:递归class Solution {public: ListNode* deleteDuplicates(ListNode* head) { if (!head || !head->next) { return head; } if (head->val != head->next->val) { h原创 2022-01-26 16:04:20 · 330 阅读 · 0 评论 -
8. 字符串转换整数 (atoi)
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−2^31, 2^31 − 1]。如果数值超过这个范围,请返回 INT_MAX (2^31 − 1) 或 INT_MIN (−2^31) 。class Solution {public://o(n)//测试://正数的情况;正常,溢出//负数的情况;正常,溢出//有其他字符的情况 int myAtoi(string s) { int res =0; int i=0;原创 2022-01-26 14:20:26 · 169 阅读 · 0 评论 -
69. Sqrt(x)
方法一:二分法class Solution {public: int mySqrt(int x) { //注:在中间过程计算平方的时候可能出现溢出,所以用long long。 long long i=0; long long j=x/2+1;//对于一个非负数n,它的平方根不会大于(n/2+1) while(i<=j) { long long mid=(i+j)/2;原创 2022-01-26 09:01:41 · 151 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
快慢指针,快的先走k步原创 2022-01-25 18:42:51 · 101 阅读 · 0 评论 -
124. 二叉树中的最大路径和
我们用题目的示例来描述一下这个算法过程:(理解如何递归很关键)> 1. 从 dfs(-10) 开始, 1.1 dfs(9): 1.1.1 左孩子为空;贡献为 0 1.1.2 右孩子为空,贡献为 0 1.1.3 更新 res = max (-∞,(9 + 0 + 0)) = 9 1.1.4 返回 dfs(9) = 9 + max(左孩子贡献,右孩子贡献)) = 9 ..原创 2022-01-25 18:31:33 · 220 阅读 · 0 评论 -
56. 合并区间
对区间左端点进行排序,然后比较上一个区间右端点与当前区间左端点进行合并不相交包含、扩展class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) { if (intervals.size() == 0) { return {}; } sort(intervals.原创 2022-01-23 16:26:21 · 174 阅读 · 0 评论 -
143. 重排链表
寻找链表中点 + 链表逆序 + 合并链表/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next)原创 2022-01-23 15:20:46 · 323 阅读 · 0 评论 -
199. 二叉树的右视图
一、BFS思路: 利用 BFS 进行层次遍历,记录下每层的最后一个元素。时间复杂度: O(N)O(N),每个节点都入队出队了 1 次。空间复杂度: O(N)O(N),使用了额外的队列空间。作者:sweetiee链接:https://leetcode-cn.com/problems/binary-tree-right-side-view/solution/jian-dan-bfsdfs-bi-xu-miao-dong-by-sweetiee/来源:力扣(LeetCode)著作权归作者所有。商业转原创 2022-01-21 14:59:11 · 743 阅读 · 0 评论 -
42. 接雨水
本文深度讲解如下三种方法:双指针法:时间复杂度为O(n^2)。 空间复杂度为O(1)。动态规划单调栈详细讲解原创 2022-01-20 19:59:18 · 123 阅读 · 0 评论 -
70. 爬楼梯(总错)
class Solution {public: int climbStairs(int n) { vector<int>dp(n+1,1); for(int i=2;i<=n;i++){ dp[i] = dp[i-1]+dp[i-2]; } return dp[n]; }};原创 2022-01-19 23:06:52 · 272 阅读 · 0 评论 -
232. 用栈实现队列
class MyQueue {public: stack<int> stIn; stack<int> stOut; /** Initialize your data structure here. */ MyQueue() { } /** Push element x to the back of queue. */ void push(int x) { stIn.push(x); } /*原创 2022-01-19 22:58:06 · 4543 阅读 · 0 评论 -
94. 二叉树的中序遍历
非递归形式颜色标记法:其核心思想如下:使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈。如果遇到的节点为灰色,则将节点的值输出。class Solution {public: vector<int> inorderTraversal(TreeNode* root) { vector<int> result; stack<pair<原创 2022-01-19 20:36:52 · 93 阅读 · 0 评论 -
300. 最长递增子序列
最长上升子序列是动规的经典题目,这里dp[i]是可以根据dp[j] (j < i)推导出来的,那么依然用动规五部曲来分析详细一波:dp[i]的定义dp[i]表示i之前包括i的最长上升子序列的长度。状态转移方程位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);注意这里不是要dp[i] 与 dp[j] + 1进行比较,而是我们要取dp[j] +原创 2022-01-18 21:37:36 · 125 阅读 · 0 评论 -
704. 二分查找
// 版本一class Solution {public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right] while (left <= right) { // 当left==right,区间[left, right]依然有效,所原创 2022-01-18 20:54:01 · 65 阅读 · 0 评论 -
54. 螺旋矩阵
class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int>ans; if(matrix.empty()) return ans; int s=0; int x=matrix.size()-1; int z=0; int y=ma原创 2022-01-18 20:07:36 · 159 阅读 · 0 评论 -
23. 合并K个升序链表
优先队列原链接优先队列方法1: 建立优先队列(最大堆或者最小堆均可),全部元素接连入队;最后再不断弹出,构建链表。这也是一种想法,不过这样子效率就有些低下了。方法2: 依然建立优先队列,不过不需要全部元素一次性入队;只需要让链表头元素入队即可,弹出该元素后,该链表往后移。class Solution {public: // 小根堆的回调函数 struct cmp{ bool operator()(ListNode *a,ListNode *b){原创 2022-01-17 21:13:39 · 63 阅读 · 0 评论 -
46. 全排列
相关问题:77.组合问题、131.切割问题和78.子集问题回溯三部曲递归函数参数递归终止条件单层搜索的逻辑大家此时可以感受出排列问题的不同:每层都是从0开始搜索而不是startIndex需要used数组记录path里都放了哪些元素了代码class Solution {public: vector<vector<int>> result; vector<int> path; void backtracking (vector&l原创 2022-01-13 20:40:03 · 87 阅读 · 0 评论 -
200. 岛屿数量 dfs
L200. 岛屿数量 (Easy)463. 岛屿的周长 (Easy)695. 岛屿的最大面积 (Medium)827. 最大人工岛 (Hard)岛屿问题总结二叉树dfs二叉树的 DFS 有两个要素:「访问相邻结点」和「判断 base case」。void traverse(TreeNode root) { // 判断 base case if (root == null) { return; } // 访问两个相邻结点:左子结点、右子结点原创 2022-01-11 21:30:56 · 287 阅读 · 0 评论 -
415. 字符串相加
class Solution {public: string addStrings(string num1, string num2) { int i = num1.length() - 1, j = num2.length() - 1, add = 0; string ans = ""; while (i >= 0 || j >= 0 || add != 0) { int x = i >= 0 ? num1原创 2021-12-27 09:00:37 · 135 阅读 · 0 评论 -
236. 二叉树的最近公共祖先
递归函数的功能给定两个节点 pp 和 qq如果 pp 和 qq 都存在,则返回它们的公共祖先;如果只存在一个,则返回存在的一个;如果 pp 和 qq 都不存在,则返回NULL递归注意写出递归的终止条件!递归使用函数后可认为左右子树已经算出结果,class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root == NULL原创 2021-12-26 22:13:18 · 162 阅读 · 0 评论 -
20. 有效的括号
栈class Solution {public: bool isValid(string s) { stack<char> stack; for(int i=0; i<s.length(); ++i){ char c = s[i]; if(!stack.empty()){ char t = stack.top(); if(t=='('原创 2021-12-26 21:43:27 · 2749 阅读 · 0 评论 -
算法常见问题
reverse(v.begin(),v.end())原创 2021-12-26 21:19:35 · 141 阅读 · 0 评论 -
103. 二叉树的锯齿形层序遍历
层序遍历+奇数层反转/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(null原创 2021-12-26 21:19:01 · 252 阅读 · 0 评论 -
88. 合并两个有序数组
拓展要求空间复杂度O(1)合并3个有序数组合并k个有序数组本题思路重点双指针从前往后+额外存储空间一个是从后往前确定两组中该用哪个数字+不用额外空间代码很容易出错!很多细节!!!class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int k = m + n - 1; w原创 2021-12-26 19:46:17 · 68 阅读 · 0 评论 -
160. 相交链表
经典题目:还是写错了,不要大意class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *A = headA, *B = headB; while (A != B) { A = A != nullptr ? A->next : headB; B = B != nullpt原创 2021-12-26 17:09:31 · 245 阅读 · 0 评论 -
121. 买卖股票的时机(股票问题)
股票问题最好的总结贪心法class Solution {public: int maxProfit(vector<int>& prices) { int low = INT_MAX; int result = 0; for (int i = 0; i < prices.size(); i++) { low = min(low, prices[i]); // 取最左最小价格 .原创 2021-12-26 16:47:50 · 182 阅读 · 0 评论 -
102. 二叉树的层序遍历
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */bfs+dfsbfs代码如果不需要确定当前遍历到了哪一层,BFS模板如下。while queue 不空:原创 2021-12-26 15:38:37 · 60 阅读 · 0 评论 -
141. 环形链表,142. 环形链表 II
快慢指针!当一个链表有环时,快慢指针都会陷入环中进行无限次移动,然后变成了追及问题。只要一直移动下去,快指针总会追上慢指针。代码class Solution {public: bool hasCycle(ListNode *head) { ListNode *slow = head; ListNode *fast = head; while(fast != nullptr) { fast = fast->next;原创 2021-12-26 14:21:37 · 420 阅读 · 0 评论 -
21. 合并两个有序链表
递归:递归函数必须要有终止条件,否则会出错;递归函数先不断调用自身,直到遇到终止条件后进行回溯,最终返回答案。代码;/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr原创 2021-12-26 14:02:31 · 82 阅读 · 0 评论 -
1. 两数之和
注意!!哈希表的使用!!!!!!1、哈希表插入?2、哈希表判断是否存在某个key两遍哈希:class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int,int> m; for(int i = 0; i<nums.size(); i++) m[nums[i]]原创 2021-12-23 22:42:30 · 405 阅读 · 0 评论 -
53. 最大子数组和
注意:dp[]代表什么dp[]的推导公式复杂度分析class Solution{public: int maxSubArray(vector<int> &nums) { //类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值 int result = INT_MIN; int numsSize = int(nums.size()); //dp[i]表示nums中以nums[i]结尾的原创 2021-12-23 22:07:24 · 185 阅读 · 0 评论