![](https://img-blog.csdnimg.cn/20210308204815180.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
AcWing Leetcode 究极班
文章平均质量分 90
AcWing Leetcode 究极班
打雷要下雨,雷欧
这个作者很懒,什么都没留下…
展开
-
Week 25. 第600-628题
611. 有效三角形的个数分析先将数组排序, 排完序后, 先固定A, B, 然后考虑C因为三角形需要满足任意两边之和大于第三边A + B > C, A + C > B 必然满足所以只需要满足 B + C > A, 即 C > A - B可以用双指针 扫描到最大的k, 是的 C > A - B那么C 可以取的范围是[k, j - 1], 所以有j - 1 - k + 1 = j - k种codeclass Solution {public: int原创 2021-04-23 20:44:10 · 196 阅读 · 0 评论 -
Week 13. 第301-315题
301. 删除无效的括号分析从前往后扫描, 遇到(就让左括号数量++; 如果遇到), 让右括号数量++l, r表示多余的左右括号数量codeclass Solution {public: vector<string> ans; vector<string> removeInvalidParentheses(string s) { int l = 0, r = 0; for (auto x : s)原创 2021-04-01 09:55:49 · 86 阅读 · 0 评论 -
Week 13. 第283-300题
283. 移动零分析双指针算法如果x不是0, 就放到当前位置上, 当前位置++扫描一遍完后, 将后面的所有数字置0codeclass Solution {public: void moveZeroes(vector<int>& nums) { int k = 0; for (auto& x : nums) if (x) nums[k ++ ] = x; while (k < nu原创 2021-03-27 15:33:59 · 120 阅读 · 0 评论 -
Week 12. 第260-282题
260. 只出现一次的数字 III分析同剑指offer73codeclass Solution {public:vector singleNumber(vector& nums) {int sum = 0;for (auto& x : nums) sum ^= x;int k = 0;while (!(sum >> k & 1)) k ++;int first = 0;for (auto& x : nums)if (x >>原创 2021-03-25 21:53:30 · 122 阅读 · 0 评论 -
Week 12. 第235-258题
235. 二叉搜索树的最近公共祖先分析分情况, 3种情况如果p, q在两边, 那么lca就是根节点如果p, q在左边, 那么递归到左子树, 那么递归到左子树(因为变成了相同的问题)如果p, q在右边, 那么递归到右边每次递归只会递归一个分支, 因此递归最大深度就是树的高度, 时间复杂度O(h), h是树的高度提高班LCA正规的lca O(logn)离线做法O(1)code/** * Definition for a binary tree node. * struct TreeNo原创 2021-03-23 11:46:35 · 155 阅读 · 0 评论 -
Week11. 第225-234题
225. 用队列实现栈分析压入压入的话, 直接把5压入队列弹出弹出的话, 按照栈的弹出方式, 应该将5弹出, 但是我们按照队列的话, 会把1弹出去所以我们先想办法把5找到, 再把5弹出去所以这里我们需要用一个额外的缓存的点, 先将1234从队列里弹出来, 然后存起来然后队列里就不存在1234了然后这样的话, 5就找到了, 将5弹出来, 弹完之后,我们将1234 放回去这个缓存的数据结构也是队列所以我们从缓存中往外去弹, 也是1234往外去弹因此再把1234顺次放到队列就可以了原创 2021-03-23 00:15:56 · 118 阅读 · 0 评论 -
Week 11. 第215-224题
215. 数组中的第K个最大元素分析快速选择模板题回顾一下快速选择确定一个基准值x将小于等于x的数 放到左边, 大于等于x的数放到右边然后递归排左边, 递归排右边这样左右两边递归完以后, 整个数组就排序完了快排期望是O(nlogn), 因为每次内部调整是O(n)的, 每次除以2, 期望会递归O(logn)层, 所以总的时间复杂度是O(nlogn)快速选择基于快排如果第k大元素在左边, 那么只递归左边就可以了如果k第k大元素在右边, 那么只递归右边就可以了也就是在递归的时候只递归一边原创 2021-03-21 21:20:06 · 294 阅读 · 0 评论 -
Week 10. 第205-214题
205. 同构字符串分析题目要求:相同字符不能映射到相同字符不同字符不能被映射到相同字符解决思路:3. 开个hash表, 存下映射, 存下当前哪个字符—>哪个字符, 每次来个新的字符的时候, 判断下字符是否被映射过了;如果被映射过的话, 判断下映射的字符是否和之前的字符一样 (存一个s—>t)4. 两个不同的字符是否映射为同一个字符, 这里需要存一个t—>s, 每次对于一个新的字符, 需要判断下, 新的字符时候被之前的某些字符映射过; 如果映射过的话, 需要看一下, 映原创 2021-03-20 17:10:48 · 102 阅读 · 0 评论 -
Week 10. 第189-204题
189. 旋转数组分析1 2 3 4 5 6 7向右边移动3位5 6 7 1 2 3 4移动k次, 相当于后面k个数移动到前面当然先要对 k % n先原地算法当然想用原地算法的话, 每次移动1个, 移动k次, 这样时间复杂度O(n^2)因为移动1次要搬运n - 1个数, k次的话要搬k(n - 1)次将数组翻转的话, 可以用原地算法来做第1次交换 第1, 第n - 12次交换, 第2, 第n - 2个数当两个指针相遇的时候, 就结束了所以可以原地算法翻转一段那么能不能用翻转原创 2021-03-19 23:11:32 · 205 阅读 · 0 评论 -
Week 9. 第167-188题
167. 两数之和 II - 输入有序数组分析只是说同一个下标上的位置上的数只能用1次, 但是如果有2个2, 在不同下标, 可以用2次code(hash)class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> hash; for (int i = 0; i < num原创 2021-03-19 00:04:12 · 180 阅读 · 1 评论 -
Week 9. 第151-166题
151. 翻转字符串里的单词分析单词不能翻转, 但是所有单词要颠倒下前后位置字符串前后会有多余的空格, 中间至多2个空格, 题目要求前后删除, 中间改成1个要求空间O(1)先将字符串以字母为最小单位翻转每个单词内部翻转(双指针)多余空格处理: 直接将原数组排到前面code注意观察细节, 刚开始j = i, t = k, 赋值, 因为需要从这里开始变换中间位置变换k = t, i = j, // k变为变化后t的位置, i变为变化后j的位置class Solution {原创 2021-03-16 23:07:05 · 336 阅读 · 0 评论 -
Week8. 第141-150题
141. 环形链表分析链表找环有环意味着从前往后遍历会遇到重复的点(重复是指地址重复)最多只有1个环, 如果有很多环图中一个蓝色点会有2个next, 分叉出去, 一个向下走, 一个向右走其实每个点只有一个指针, 因此有环的话就只有1个环开个hash表存下地址, 然后遍历的过程中判断有无出现重复的点, 如果有重复点, 说明有环时间O(n), 空间O(n)题目要求空间O(1)快慢指针:如果这样走每次迭代 快指针与慢指针之间的距离k(图中绿色段)会-1, 所以迭代k次, 快指针会追上慢指原创 2021-03-15 17:29:12 · 124 阅读 · 0 评论 -
Week 8. 第131-140题
131. 分割回文串分析首先分割的方案可能有指数级别, 假设每一个字符都是相同的aaaaa, n个字母, 那么有n - 1个位置可以分割, 每个位置可以选择分/ 部分, 所以整个分割方案是2^n发现分割方案是指数级别, 那么直接爆搜爆搜的时候, 需要加一些优化, 因为爆搜的时候需要一段一段来搜每次搜的时候, 会搜当前i位置开始的回文串, 比如搜到[i, j], 但是需要判断[i, j]区间是否是回文串,需要快速的判断原字符串的某个子段是否是回文串如果说直接做, 可以线性扫描. 其实可以预处理下原创 2021-03-14 11:15:03 · 114 阅读 · 0 评论 -
leetcode 121-130
121. 买卖股票的最佳时机分析只有1支股票, 最多完成一笔交易样例模拟7 1 5 3 6 4发现可以在第2天买入, 第5天卖出, 获利5扫描一遍就可以了具体:当前第i天, 记录下[1, i-1]中的最小值, 然后在第i天卖出的话, 只需要在最小值的地方买入, 这样对每天取max, 然后[1, i - 1]的最小值, 可以边扫描边维护整个算法时间复杂度O(n)codeclass Solution {public: int maxProfit(vector<int>原创 2021-03-13 14:23:06 · 131 阅读 · 0 评论 -
Leetcode 111-120
LeetCode 111. 二叉树的最小深度分析递归分析左右子树.根据定义, 如果u是叶子结点, 那么深度为1.如果不是叶子节点, 分成3种情况1.左子树a, 右子树b 不空, 返回min(f(a), f(b)) + 12.a不空, b空, 返回f(a) + 13.a空, b不空 返回f(b) + 1代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNod原创 2021-03-02 10:05:46 · 85 阅读 · 0 评论 -
Leetcode101 - 110
LeetCode 101. 对称二叉树分析排除根节点, 分别对左右子树进行递归遍历, 判断是否对称相等.需要重新写一个函数, 判断是否对称代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullp原创 2021-03-01 18:03:17 · 92 阅读 · 0 评论 -
LeetCode 91 - 100
LeetCode 91. 解码方法分析有点类似于编辑距离问题, 所以考虑编辑距离合法的情况, 用dp去分析合法的情况是指12可以看成了两个数1和2或者12注意,f[i] 既可以从f[i - 1]转化过来, 也可以从f[i - 2]转化过来还需要注意什么时候能从f[i - 1]和f[i - 2]转化过来代码class Solution {public: int numDecodings(string s) { int n = s.size(); s原创 2021-03-01 11:13:49 · 113 阅读 · 0 评论 -
Leetcode 81-90
LeetCode 81. 搜索旋转排序数组 II分析因为有重复数字的存在, 旋转后的数组第一个数 可能和最后一个数相等, 这样的话, 就不容易判断target到底属于 前半段区间, 还是后半段区间.因此需要加个while循环, 排除重复元素, 并不影响结果的判定.因为后一个区间的值全是小于nums[0]的,所以可以通过二分, 找到前半段区间的右端点的值, 即>= nums[0]最靠右的值然后让判断target是否在所找的区间内部即可.codeclass Solution {pub原创 2021-03-03 22:25:56 · 88 阅读 · 1 评论 -
leetcode 71-80
LeetCode 71. 简化路径(华为2020.9秋招面试第2题)分析codeclass Solution {public: string simplifyPath(string path) { string res, name; // res 表示答案, name表示当前取到的目录名 // 方向 -> if (path.back() != '/') path += '/'; for (auto c : path){原创 2021-03-04 21:54:50 · 159 阅读 · 1 评论 -
leetcode 61-70
61. 旋转链表分析注意 k >= n, k %= ncode/** * 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原创 2021-03-05 23:51:02 · 111 阅读 · 0 评论 -
leetcode 51-60
51. N 皇后分析与leetcode79 走迷宫方法类似联动leetcode 79codeclass Solution {public: vector<vector<string>> ans; vector<string> res; int dg[22], udg[22], col[11]; vector<vector<string>> solveNQueens(int n) { for原创 2021-03-06 10:38:05 · 132 阅读 · 0 评论 -
leetcode 41-50
41. 缺失的第一个正数分析将每个数放到hash表中, 从小到大枚举每个正整数, 直到找到第一个没找到的正整数第一步, 将每个数放到hash表中, O(n).第二步, 枚举最多只会枚举到 n + 1, O(n)因此整个时间复杂度O(n)codeclass Solution {public: int firstMissingPositive(vector<int>& nums) { unordered_set<int> hash;原创 2021-03-07 10:54:13 · 138 阅读 · 0 评论 -
leetcode 31-40
31. 下一个排列分析应该尽可能的保证高位不变, 变低位, 这样的话才是比当前字典序大的最小的因此可以从后往前去考虑, 如果到某一位的时候, 当前数与后面的数构成降序关系, 那么当前这位不可能变大,因为前面这些数保证不变, 当前数已经是后面数中最大的数了, 因此当前位的数字不可能变得更大, 因此当前位不能动任何手脚.也就是说, 只要后面是降序(不一定严格降序), 那么当前位的数字不可能发生任何变化, 如果想让当前字典序变得大一些, 应该找到一个非降序的位置, 前一个数比后面一个数稍微小一些, 那么原创 2021-03-09 09:16:10 · 146 阅读 · 6 评论 -
leetcode 21-30
26. 删除排序数组中的重复项分析同leetcode 80codeclass Solution {public: int removeDuplicates(vector<int>& nums) { int k = 0; for (auto x : nums) if (!k || nums[k - 1] != x) nums[k ++] = x; return k;原创 2021-03-05 23:33:56 · 106 阅读 · 0 评论 -
leetcode 11-20
11. 盛最多水的容器分析用两个指针, 一个指针指向最开头, 一个指针指向最结尾,如果第2个指针的高度比较低的话, 那就把第2个指针, 往前移动1位如果第1个指针的高度比较低的话, 那就把低1个指针, 往后移动1位每移动完一次, 求下当前两指针所构成的面积, 更新下最大值模拟样例:第1次:高度: [1, 8, 6, 2, 5, 4, 8, 3, 7]下标: [0, 1, 2, 3, 4, 5, 6, 7, 8]距离是8, 高度是1, 面积8第2次, 高度: [1, 8, 6, 2,原创 2021-03-11 14:00:29 · 143 阅读 · 0 评论 -
leetcode 1-10
3. 无重复字符的最长子串分析双指针, j为后指针, i为前指针当hash[j] > 1说明s[j] 元素在前面重复了, i指针后移联动LeetCode 76. 最小覆盖子串codeclass Solution {public: int lengthOfLongestSubstring(string s) { unordered_map<char, int> hash; int res = 0; for (int i =原创 2021-03-05 22:36:09 · 1136 阅读 · 0 评论