Leetcode其他经典题
SL_World
中国科学院大学计算机应用技术专业在读研究生
展开
-
Leetcode|递归分治法|面试题 08.06. 汉诺塔问题
1 递归分支法用数学归纳法解决n = 1,盘子从A直接移动到Cn = 2n = k,将A上n-1个盘子移动到B,然后将最底下的盘子移动到C,最后将B中的盘子移动到Cclass Solution {public: void hanota(vector<int>& A, vector<int>& B, vector<int>& C) { int n = A.size(); move(n, A,.原创 2021-09-15 22:17:58 · 307 阅读 · 0 评论 -
Leetcode|二分+缩小右区间去重|154. 寻找旋转排序数组中的最小值 II
1 二分+缩小右区间去重情况1——nums[mid]在最小值右边或就是最小值情况2——nums[mid]在最小值左边对于重复数组,又多了情况三情况3——nums[mid]和nums[right]相等重复class Solution {public: int findMin(vector<int>& nums) { int size = nums.size(); int left = 0, right = size -.原创 2021-09-12 16:27:09 · 201 阅读 · 0 评论 -
Leetcode|二分查找|153. 寻找旋转排序数组中的最小值
1 二分查找(注意右边界控制)情况1——nums[mid]在最小值右边或就是最小值情况2——nums[mid]在最小值左边class Solution {public: int findMin(vector<int>& nums) { int size = nums.size(); int left = 0, right = size - 1; // 不能是left <= right, 当nums={2,.原创 2021-09-12 15:59:40 · 289 阅读 · 0 评论 -
Leetcode|快慢指针|61. 旋转链表
1 快慢指针class Solution {public: ListNode* rotateRight(ListNode* head, int k) { if (!head || k == 0) return head; int size = 0; auto node = head; // 记录链表长度为size while (node) { size++; ..原创 2021-09-09 17:02:15 · 158 阅读 · 0 评论 -
Leetcode|快排|912. 排序数组
1 快速排序(随机pivot)为什么随机取pivot能避免最坏的情况呢?假设数据是完全随机的话,固定取最后一个数作为pivot,和随机取pivot,达成pivot本身有序的概率是相等的。但实际情况并非如此,实际的数据里有序的情况是多于完全无序的情况的,所以随机取pivot能减少最坏情况出现的概率class Solution {public: void quickSort(vector<int>& nums, int left, int right) { .原创 2021-09-08 16:25:13 · 330 阅读 · 0 评论 -
Leetcode|指针分别遍历双链表|剑指 Offer 52. 两个链表的第一个公共节点
1 拼接两个链表再乘2,使得加长两两链表路径长相同—空间复杂度O(1)O(1)O(1)class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { if (!headA || !headB) return nullptr; auto nodea = headA; auto nodeb = headB; // 当两..原创 2021-09-08 15:22:56 · 179 阅读 · 0 评论 -
Leetcode|队1出栈+队2中转|225. 用两个队列实现栈
《225. 用两个队列实现栈》1 队1出栈+队2中转两个队列q1和q2,新入栈的元素先放入q2,然后将q1中元素逐个入队q2,再交换2队列即可class MyStack {public: queue<int> q1, q2; /** Initialize your data structure here. */ MyStack() { } /** Push element x onto stack. */ void pu原创 2021-08-30 11:39:02 · 247 阅读 · 0 评论 -
Leetcode|入栈+出栈实现队列|剑指 Offer 09. 用两个栈实现队列
1 入栈+出栈实现队列一个栈用于入队,一个栈用于出队操作class CQueue {public: stack<int> stk1, stk2; // stk1用于入队,stk2用于出队 CQueue() { while (!stk1.empty()) stk1.pop(); while (!stk2.empty()) stk2.pop(); } void appendTail(int value) {.原创 2021-08-30 10:28:57 · 245 阅读 · 0 评论 -
Leetcode|二分+缩小左右区间去重|81. 搜索旋转排序数组 II
1 二分+缩小左右区间去重对于nums[left] == nums[mid] == nums[right]情况,如nums=[3,1,2,3,3,3,3], target=2nums[0] == nums[3] == nums[6] == 3,无法判断该搜索左侧区域还是右侧区域,一个简单的想法是同时缩小左右侧区域[left, right] => [left + 1, right - 1]nums=[3,1,2,3,3,3,3] => nums=[1,2,3,3,3]class .原创 2021-08-12 13:36:17 · 204 阅读 · 2 评论 -
Leetcode|数组上下翻转+主对角线翻转|48. 旋转图像
1 数组上下翻转+主对角线翻转class Solution {public: void rotate(vector<vector<int>>& matrix) { int size = matrix.size(); // 1.上下翻转 for (int j = 0; j < size; j++) for (int i = 0; i < size / 2; i++) ..原创 2021-08-12 11:17:36 · 488 阅读 · 0 评论 -
Leetcode|取余+数组翻转|189. 旋转数组
1 数组翻转—O(1)O(1)O(1)空间复杂度,O(n)O(n)O(n)时间复杂度class Solution {public: void reverse(vector<int>& nums, int left, int right) { while (left < right) { swap(nums[left], nums[right]); left++; right--; } .原创 2021-08-12 10:53:03 · 273 阅读 · 0 评论 -
Leetcode|区间首尾元素大小判断成序+二分查找|33. 搜索旋转排序数组
1 旋转数组的二分查找在二分搜索基础上,判断左右区间中的收尾元素大小,来判断是否成序,不成序或target在这个区间则搜索,否则搜索另外一个区间class Solution {public: int search(vector<int>& nums, int target) { int size = nums.size(); int left = 0, right = size - 1; while (left <.原创 2021-08-11 00:03:57 · 208 阅读 · 0 评论 -
Leetcode|从后向前找首对升序对再交换右侧数并升序|31. 下一个排列
两遍扫描以求 12385764 的下一个排列为例:class Solution {public: void nextPermutation(vector<int>& nums) { int left = 0, right = 0, next = INT_MAX; int size = nums.size(); // 1.找到连续升序的左索引left for (int i = size - 1; ..原创 2021-08-02 17:51:48 · 221 阅读 · 0 评论 -
Leetcode|小根堆|23. 合并K个升序链表
文章目录1 两两链表合并(超时)2 将K个链表首个节点依次压入小根堆,然后逐个弹出1 两两链表合并(超时)class Solution {public: ListNode* merge2Lists(ListNode* l1, ListNode* l2) { auto prehead = new ListNode(); auto merge = prehead; while (l1 || l2) { if (!l1) {原创 2021-07-27 09:49:43 · 274 阅读 · 0 评论 -
Leetcode|有序数组合并|4. 寻找两个正序数组的中位数
1 有序数组合并class Solution {public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { vector<int> merge; int size1 = nums1.size(); int size2 = nums2.size(); int sizem = siz..原创 2021-07-26 22:55:49 · 200 阅读 · 0 评论 -
Leetcode|索引置换|41. 缺失的第一个正数
腾讯秋招提前批AI Lab一面面试题1 原地数组索引置换[3, 4, -1, 1] => [1, -1, 3, 4],这样遍历到nums[1] != 2就返回缺失的2class Solution {public: int firstMissingPositive(vector<int>& nums) { int size = nums.size(); // 1.遇到与索引+1不同的数就置换,如[3,4,-1,1],其中nums[原创 2021-07-24 23:55:08 · 145 阅读 · 0 评论 -
Leetcode|BFS+DFS拓扑排序|210. 课程表 II
1 DFS拓扑排序class Solution {public: vector<vector<int>> edges; // 邻接矩阵 vector<int> visited; // 0-未搜索; 1-已访问; 2-已压栈 vector<int> res; // 最终结果 stack<int> stk; // 存放结果的栈,图的子节点先入栈,父节点.原创 2021-07-20 13:37:00 · 212 阅读 · 0 评论 -
Leetcode|BFS每层最后1个节点|199. 二叉树的右视图
1 BFS每层最后1个节点添加到解中思路: 利用 BFS 进行层次遍历,记录下每层的最后一个元素class Solution {public: vector<int> rightSideView(TreeNode* root) { if (!root) return {}; vector<int> res; queue<TreeNode*> q; q.push(root); .原创 2021-07-17 23:45:41 · 229 阅读 · 1 评论 -
Leetcode|找单链表中点+链表反转+链表合并|143. 重排链表
1 寻找单链表中点 + 链表反转 + 链表合并这道题是道综合题,把三个知识点串起来,非常适合复习链表处理的三个技巧【思路】:观察发现可以把链表后一半进行反转,然后当成两个链表的合并任务即可class Solution {public: void reorderList(ListNode* head) { if (!head) return; // 1.寻找链表中点(快慢指针) auto premid = findmid(head); .原创 2021-07-17 22:31:10 · 291 阅读 · 0 评论 -
Leetcode|固定四角从外围至内围|54. 螺旋矩阵
1 模拟class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int> res; int rowlen = matrix.size(); // 行数 int collen = matrix[0].size(); // 列数 int left ..原创 2021-07-17 19:27:34 · 182 阅读 · 0 评论 -
Leetcode|双指针/快慢指针|19. 删除链表的倒数第 N 个结点
1 快慢指针class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { auto pre = new ListNode(); auto prehead = pre; pre->next = head; auto slow = head; auto fast = head; for (int i = 0;.原创 2021-07-17 15:08:44 · 111 阅读 · 0 评论 -
Leetcode|sort+双指针|88. 合并两个有序数组
1 双指针class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int idx1 = 0, idx2 = 0; vector<int> tmp; while (idx1 < m || idx2 < n) { if (idx1 == m.原创 2021-07-09 11:28:01 · 131 阅读 · 0 评论 -
Leetcode|7. 整数反转
1 直接求解class Solution {public: int reverse(int x) { long a = 0; while (x / 10 != 0 || x % 10 != 0) { // 比如从123中取出2,则a = 3 * 10 + 2 = 32 a = a * 10 + x % 10; x /= 10; // 保证在int范围内 .原创 2021-07-09 10:54:23 · 109 阅读 · 0 评论 -
Leetcode|短链表后补零|2. 两数相加
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 *next) ..原创 2021-07-09 10:30:08 · 168 阅读 · 0 评论 -
Leetcode|滑动窗口变种|3. 无重复字符的最长子串
1 滑动窗口变种class Solution {public: int lengthOfLongestSubstring(string s) { if (s.size() < 2) return s.size(); unordered_map<char, int> need; int left = 0, right = 0; int len = 0; while (right < s.siz.原创 2021-07-01 11:31:50 · 139 阅读 · 0 评论 -
Leetcode|滑动窗口|438. 找到字符串中所有字母异位词
1 滑动窗口class Solution {public: vector<int> findAnagrams(string s, string p) { if (s.empty()) return {}; unordered_map<char, int> need, window; for (auto& c : p) need[c]++; int left = 0, right = 0, vaild.原创 2021-07-01 09:27:44 · 170 阅读 · 0 评论 -
Leetcode|滑动窗口|567. 字符串的排列
1 滑动窗口class Solution {public: bool checkInclusion(string s1, string s2) { unordered_map<char, int> need, window; for (auto& c : s1) need[c]++; int left = 0, right = 0, vaild = 0; int len = s1.size(); .原创 2021-06-30 22:53:43 · 123 阅读 · 0 评论 -
Leetcode|滑动窗口|76. 最小覆盖子串
1 滑动窗口class Solution {public: string minWindow(string s, string t) { // need表示t对应的<字符, 频率>,window表示s的 unordered_map<char, int> need, window; // 先根据已知计算得到t对应的每个字符频率 for (auto& c : t) need[c]++; .原创 2021-06-30 22:28:43 · 187 阅读 · 0 评论 -
Leetcode|前缀和(双向前缀积)|剑指 Offer 66. 构建乘积数组
1 前缀和(双向前缀积)class Solution {public: vector<int> constructArr(vector<int>& a) { int size = a.size(); vector<int> pre(size + 1, 1); vector<int> last(size + 1, 1); vector<int> res(size, .原创 2021-06-30 17:14:52 · 220 阅读 · 0 评论 -
Leetcode|前缀和+哈希表|560. 和为K的子数组
1 前缀和(未经哈希表优化)class Solution {public: int subarraySum(vector<int>& nums, int k) { int count = 0; int size = nums.size(); // 前缀和数组 vector<int> pre(size + 1, 0); // 计算前缀和数组的值 for (int i .原创 2021-06-30 16:11:34 · 202 阅读 · 0 评论 -
Leetcode|并查集+count|1319. 连通网络的操作次数
1 并查集 + countclass UnionFind {public: int count; vector<int> parent, size; UnionFind(int n) { count = n; parent.resize(n); size.resize(n); for (int i = 0; i < n; i++) { parent[i] = i; ..原创 2021-06-30 13:11:08 · 180 阅读 · 0 评论 -
Leetcode|DFS|695. 岛屿的最大面积
1 DFSclass Solution {public: int row, col, count; int maxcnt = 0; void dfs(vector<vector<int>>& grid, int r, int c) { if (r < 0 || c < 0 || r >= row || c >= col || grid[r][c] != 1) return; grid[r][.原创 2021-06-30 11:27:23 · 146 阅读 · 0 评论 -
Leetcode|并查集+哈希表|721. 账户合并
1 并查集 + 双哈希表此处要用两个哈希表,功能分别为存储每个去重邮箱到用户ID的映射,以①在并查集union前帮助并查集判断两个重复邮箱是否同一人;②在并查集union后作为输入查找根节点用户ID,然后添加到每个用户ID到所属邮箱列表的映射存储每个用户ID到所属邮箱列表的映射class UnionFind {public: int count; vector<int> parent, size; UnionFind(int n) { .原创 2021-06-30 11:18:14 · 214 阅读 · 0 评论 -
Leetcode|并查集|547. 省份数量
1 并查集class UnionFind {public: int count; vector<int> parent, size; UnionFind(int n) { count = n; parent.resize(n); size.resize(n); for (int i = 0; i < n; i++) { parent[i] = i; ..原创 2021-06-30 08:47:32 · 178 阅读 · 0 评论 -
Leetcode|并查集|785. 判断二分图
1 并查集遍历每个节点对应的邻接点,将每个邻接点通过并查集聚类同时检查顶点是否与邻接点被聚到1类,若是则不满足二分图性质注意孤立点判断class UnionFind {public: int count; vector<int> parent, size; UnionFind(int n) { count = n; parent.resize(n); size.resize(n); for..原创 2021-06-30 08:35:44 · 261 阅读 · 0 评论 -
Leetcode|DFS|面试题 16.19. 水域大小
1 DFSclass Solution {private: int row, col, count; vector<int> watersize;public: void dfs(vector<vector<int>>& land, int r, int c) { if (r < 0 || c < 0 || r >= row || c >= col || land[r][c] != 0) re.原创 2021-06-29 23:12:17 · 170 阅读 · 0 评论 -
Leetcode|哈希集合|128. 最长连续序列
1 哈希集合使用哈希集合去重,遍历哈希集合,找到无前继元素,然后逐渐+1判断是否还有递增连续数字,若有则计数器加1class Solution {public: int longestConsecutive(vector<int>& nums) { if (nums.empty()) return 0; unordered_set<int> set; // 使用集合去重 for (auto&.原创 2021-06-29 22:39:02 · 131 阅读 · 0 评论 -
Leetcode|DFS|130. 被围绕的区域
1 DFS遍历棋盘边界,将边界对应的所有O进行dfs遍历成#遍历棋盘,将所有中间O遍历成X遍历棋盘,将所有中间#恢复成Oclass Solution {public: int n, m; void dfs(vector<vector<char>>& board, int x, int y) { if (x < 0 || y < 0 || x >= n || y >= m || board[x][y] !=.原创 2021-06-29 20:29:49 · 163 阅读 · 0 评论 -
Leetcode|并查集|990. 等式方程的可满足性
1 并查集将等式左右两侧的字母(节点)在图中进行连接将不等式左右两侧的字母在图中检查连通性,若连通,则式子冲突,否则满足class UnionFind {public: int count; // 连通分量 vector<int> parent, size; UnionFind(int n) { count = n; // 初始每个节点是1课树 parent.resize(n); // 父节点 ..原创 2021-06-29 19:51:41 · 172 阅读 · 0 评论 -
Leetcode|字符串回溯法|22. 括号生成
1 回溯法class Solution {private: vector<string> solution; string path = "";public: void backtrack(int len, int left, int right, int n) { if (len == n * 2) { solution.push_back(path); return; } .原创 2021-06-29 15:26:47 · 178 阅读 · 0 评论