
Leetcode
文章平均质量分 89
leetcode
UnendingGlory
路有尽,命有时,生当燎原向天问
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
641 设计循环双端队列
双向循环链表模拟deque #include <bits/stdc++.h> // 双向循环链表模拟 struct node { int val; struct node *pre, *next; node(int _val){val = _val;}; }; class MyCircularDeque { int size, cur_size; ...原创 2020-04-05 23:01:10 · 272 阅读 · 0 评论 -
46 全排列
经典解法,递归 + 标记访问数组 // 经典解法 class Solution { int n; unordered_map<int, bool> vis; vector<int> p; vector<vector<int>> ans; public: // 递归生成,分解成子问题 void gene...原创 2020-04-05 21:56:34 · 207 阅读 · 0 评论 -
8 字符串转整数aoti
注意"+42"返回值是42 // 注意"+42"返回值是42 class Solution { public: int myAtoi(string str) { long long ans = 0; int i = 0, sign = 1; // 先清空字符串前缀空格 while(str[i] == ' ') ++i; ...原创 2020-04-03 12:13:07 · 309 阅读 · 0 评论 -
289 生命游戏
简单题,开两个二维数组或使用复合状态 class Solution { public: // -1之前是活细胞现在是死细胞,0死细胞,1活细胞,2之前是死细胞现在是活细胞 void gameOfLife(vector<vector<int>>& board) { int dx[8] = {1, 0, -1, 0, 1, -1, 1, ...原创 2020-04-02 12:39:11 · 204 阅读 · 0 评论 -
1111 有效括号的嵌套深度
用栈来计算深度,但是此题中输入已经保证了括号一定是匹配的,所以不需要真的用栈 直观解法1:每次操作使得A集合和B集合的深度相差最小 class Solution { public: // 使得两组字符串的深度相差最小 vector<int> maxDepthAfterSplit(string seq) { vector<int> ans; ...原创 2020-04-01 11:29:53 · 155 阅读 · 0 评论 -
面试题 17.12 BiNode
思路:中序遍历并修改指针 递归版本 class Solution { TreeNode* pre; public: // 递归遍历处理,中序遍历的同时将pre的右指针指向自己即可 void inOrder(TreeNode *root) // pre的值要传给上一层,所以用引用或者全局 { if(root == nullptr) return; ...原创 2020-03-31 14:48:39 · 292 阅读 · 0 评论 -
1382 将二叉搜索树变平衡
先中序遍历得到序列,再二分建树,必定是平衡二叉树 class Solution { vector<int> in; public: void inOrder(TreeNode* root) { if(root == nullptr) return; inOrder(root->left); in.push_...原创 2020-03-29 18:55:46 · 174 阅读 · 0 评论 -
820 单词的压缩编码
灵活使用字典树数据结构。 即寻找所有不是其他单词后缀的单词 使用前缀树,先将单词倒转,然后建树,最后遍历之即可 // 节点 class Trie { bool is_end; string word; Trie *next[26]; public: Trie() { is_end = false; for(int i = 0...原创 2020-03-28 14:12:23 · 156 阅读 · 0 评论 -
315 计算右侧小于当前元素的个数
使用计数法,维护一个cnt计数数组,从右往左遍历原数组 对于nums中的每个元素i,出现一次,则++cnt[i] 由于要求右边比其小的元素个数,所以即求cnt[i - 1] + cnt[i - 2] + … 这两个问题刚好对应 307题 的 update 和 sumRange操作,可以用树状数组解决(代码中不需要存cnt数组) 与307题不同的是,此题需要将nums中的元素作为树状数组的下标,由于...原创 2020-03-23 09:05:02 · 250 阅读 · 0 评论 -
307 区域和检索
四种方法。 方法1: 直接暴力,sumRange o(n),update为o(1),如果k次操作均是求和,则时间复杂度为o(kn),难以承受 class NumArray { vector<int> v; public: NumArray(vector<int>& nums) { for(int i :nums) v.push_bac...原创 2020-03-21 19:14:31 · 140 阅读 · 0 评论 -
212 单词搜索II
思路: 先将单词插入到前缀树中,然后再DFS一步步去判断下一个要遍历的字符是否存在前缀树中,若存在,则加入中间变量中,若当前遍历的字符序列在字典树中组成一个单词,则加入ans中 不存在,则停止该方向的搜索,因为前缀不存在,则后面DFS生成的单词均以此为前缀,均不存在 在DFS时使用一个set来保存存在于前缀树中的单词,因为遍历时可能会有重复的单词加入,注意DFS时对于vis数组和中间变量的重置。 ...原创 2020-03-20 17:37:00 · 176 阅读 · 0 评论 -
211 添加与搜索单词
思路:前缀树,注意输入正则字符串的时候对’ . '的处理。 class Trie { public: bool is_end; Trie *next[26]; Trie() { is_end = false; for(int i = 0; i < 26; ++i) next[i] = nullptr; } vo...原创 2020-03-20 15:17:35 · 139 阅读 · 0 评论 -
面试题40 最小的k个数
与 703 数据流中第k个大元素思路类似 https://blog.youkuaiyun.com/include_not_found_/article/details/104858263 class Solution { // 堆排序,维护一个大顶堆 public: vector<int> getLeastNumbers(vector<int>& arr, ...原创 2020-03-20 11:01:50 · 111 阅读 · 0 评论 -
208 实现Trie前缀树
字典树,用于统计,排序和保存大量的字符串,利用字符串的公共前缀来减少查询时间,查询效率比哈希树高。 示例: 联想此图,很容易写出插入,查找,查找是否存在前缀等函数 class Trie { bool is_end; // 当前是否是一个单词的结尾 Trie *next[26]; // 该节点往下 public: /** Initialize your data struc...原创 2020-03-20 10:29:07 · 200 阅读 · 0 评论 -
207 课程表
简单的队列 + 拓扑排序 class Solution { public: bool canFinish(int numCourses, vector<vector<int>>& prerequisites) { int c[numCourses], cnt = 0; vector<vector<int>&g...原创 2020-03-19 21:13:01 · 144 阅读 · 0 评论 -
232 用栈实现队列
栈模拟队列,入队时利用辅助栈将入队元素放在栈底 class MyQueue { stack<int> s1; public: /** Initialize your data structure here. */ MyQueue() { } /** Push element x to the back of queue. */ ...原创 2020-03-19 20:34:12 · 107 阅读 · 0 评论 -
1042 不邻接植花
一开始理解错题意。。写了个并查集没过 只是简单的考察图的数据结构== class Solution { public: vector<int> gardenNoAdj(int N, vector<vector<int>>& paths) { vector<vector<int>> g(N + 1); ...原创 2020-03-19 17:41:10 · 190 阅读 · 0 评论 -
997 找到小镇法官
目标点入度 == N - 1,出度 = 0 class Solution { public: int findJudge(int N, vector<vector<int>>& trust) { int indegree[N + 1], outdegree[N + 1]; memset(indegree, 0, sizeof(...原创 2020-03-19 16:37:58 · 234 阅读 · 0 评论 -
409 最长回文串
思路: 偶数次数的字符才能完美对称 奇数次数的要么没有,有则去除对子后必然只剩一个在中间 统计奇数次数的字符个数即可 class Solution { public: int longestPalindrome(string s) { int cnt[26][2]; // 0: Upper , 1: lower memset(cnt, 0, sizeof...原创 2020-03-19 11:32:39 · 151 阅读 · 0 评论 -
1361 验证二叉树
只根据入度判断是典型的错误算法(完美踩坑!!气死了),有向图中可能存在环或者非联通 正确思路: 先用DFS / BFS / 并查集判断是否是联通图 再通过边数和入度来判断即可,满足边数 = n - 1的连通图一定不存在环,一定是树 class Solution { public: void DFS(int x, vector<int>& leftChild, vec...原创 2020-03-18 23:17:34 · 232 阅读 · 0 评论 -
1202 字符串中的元素
思路: 采用并查集,在输入pairs的时候合并,分为不同的集合 开一个二维的vector,用来存储每一个类的字符,并排序之 最后遍历一遍原字符,在其father的vector中一次拿一个字符 class Solution { vector<int> father; public: int findFather(int x) { int a =...原创 2020-03-18 21:12:12 · 358 阅读 · 0 评论 -
130 被包围的区域
思路: 依题意,被围的区间’O’不会位于边界上,那么我们设立一个标记数组protect,从边界开始BFS或者DFS,与边界上的’O’相连的内部’O’都protect起来。 之后,再去遍历矩阵内部,未被保护的’O’均修改成’X’即可. 注意输入为空时的处理。 class Solution { int row, col; int dx[4] = {0, 1, 0, -1}, dy[4]...原创 2020-03-17 20:30:24 · 181 阅读 · 0 评论 -
面试题55 平衡二叉树
后序遍历即可 class Solution { bool flag = true; public: int getHeight(TreeNode* root) { if(!root) return 0; int l_h = getHeight(root->left), r_h = getHeight(root->right); /...原创 2020-03-17 13:23:55 · 190 阅读 · 0 评论 -
面试题15 二进制中1的个数
与面试题39类似,位运算 class Solution { public: int hammingWeight(uint32_t n) { int ans = 0; while(n) { if(n & 1) ++ans; n >>= 1; } ...原创 2020-03-17 12:25:57 · 201 阅读 · 0 评论 -
面试题39 数组中出现次数超过一半的数字
class Solution { public: int majorityElement(vector<int>& nums) { unordered_map<int, int> m; // 不知道数的范围用map int x = nums.size() >> 1; // 除2,提前计算好减少耗时 ...原创 2020-03-17 12:14:08 · 117 阅读 · 0 评论 -
1356 根据数字二进制下1的数目排序
直接除基取余法暴力 class Solution { int m[10005]; public: vector<int> sortByBits(vector<int>& arr) { memset(m, 0, sizeof(m)); for(int i : arr) { int ...原创 2020-03-17 11:57:45 · 326 阅读 · 0 评论 -
1160 拼写单词
仔细读题,每次拼写某个单词时时,chars中的每个字母只能用一次 多个单词的拼写其实是在重复使用chars class Solution { public: int countCharacters(vector<string>& words, string chars) { int *p = new int[26]; memset(p, ...原创 2020-03-17 10:24:47 · 213 阅读 · 0 评论 -
242 有效的字母异位词
class Solution { public: bool isAnagram(string s, string t) { unordered_map<char, int> S, T; for(auto i : s) ++S[i]; for(auto i : t) ++T[i]; return S == T ? t...原创 2020-03-16 12:29:58 · 295 阅读 · 0 评论 -
1221 分割平衡字符串
输入字符串中L和R数目已经相同 题目未要求求各平衡字符串,若要求出各平衡字符串则应用双指针遍历或者栈 class Solution { public: int balancedStringSplit(string s) { int ans = 0, cnt = 0; for(int i = 0; i < s.size(); ++i) {...原创 2020-03-16 12:14:52 · 181 阅读 · 0 评论 -
面试题 01.06 字符串压缩
简单题,注意边界情况处理即可。 class Solution { public: string compressString(string S) { string ans; char pre = S[0]; int cnt = 0; for(int i = 0; i < S.size(); i++) { ...原创 2020-03-16 11:11:25 · 146 阅读 · 0 评论 -
1029 两地调度
思路:先不考虑两个城市去的人数,优先选小的 然后考虑城市人数均分,将人数多的城市均给另一个城市 如何选择?容易想到,为了保证总体值最小,选择的应该是cost的差值小的 输入时用小顶堆来维护即可 class Solution { public: int twoCitySchedCost(vector<vector<int>>& costs) { ...原创 2020-03-16 10:30:17 · 106 阅读 · 0 评论 -
874 模拟行走机器人
依题意,显然应该一步步模拟之 其中难解决的两个问题: 如何判断面对的是障碍点? 当然可以定义一个很大的二维数组,然后将障碍点记为1,但那样极其浪费内存 我们可以定义一个类型为pair的set,一开始将障碍点的坐标insert进set中,每走一步,判断面对的点是不是障碍点,若不是障碍点,则继续往前走,若是障碍点,则停下,等待转弯 我这里选择了unordered_set,需要注意自己重写一个哈希类 ...原创 2020-03-15 18:13:31 · 183 阅读 · 0 评论 -
695 岛屿的最大面积
方法一:BFS class Solution { public: int maxAreaOfIsland(vector<vector<int>>& grid) { int row = grid.size(), col = grid[0].size(); int dx[4] = {1, 0, -1, 0}, dy[4] = {0...原创 2020-03-15 15:37:13 · 124 阅读 · 0 评论 -
1046 最后一块石头的重量
水题,思路很直观。 class Solution { public: int lastStoneWeight(vector<int>& stones) { priority_queue<int, vector<int>> pq; // 默认大顶堆 for(auto i : stones) pq.push(i); ...原创 2020-03-14 16:25:27 · 156 阅读 · 0 评论 -
703 数据流中第k大元素
// 方法一,第一遍, 56ms,有很多很迷的垃圾操作 class KthLargest { int K; vector<int> heap; public: KthLargest(int k, vector<int>& nums) { //heap.resize(k + 1); K = k; // 赋值给私有...原创 2020-03-14 12:40:16 · 156 阅读 · 0 评论