leetcode
文章平均质量分 89
leetcode,剑指offer
zj134_
以物喜
展开
-
LeetCode第 49 题:字母异位词分组(C++)
49. 字母异位词分组 - 力扣(LeetCode)核心问题在于如何(快速)判断字母异位词,很容易想到字符串匹配里面的RK算法,其实就是一种编码方式。最简单的可以将每个单词的每个字母的ascii码加起来,因为字母异位词加起来得到的和必然是相同的,但是单词太多就可能冲突:不是字母异位词加起来也可能相同,既然加不行,可以乘啊,而且不一定非要用一个整数来编码,用字符串也可以,排序就是字符串的思路。排序class Solution {public: vector<vector<stri原创 2020-12-14 16:39:02 · 1457 阅读 · 1 评论 -
LeetCode第 842 题:将数组拆分成斐波那契序列(C++)
842. 将数组拆分成斐波那契序列 - 力扣(LeetCode)标准的枚举题型了,由于存在不能拆分的情况,所以应该使用带返回值的回溯,需要枚举前两个数字,然后根据前两个数字依次检查后面是否存在合法的序列,如果有,则返回true,否则返回false。class Solution {public: vector<int> res; bool dfs(string &s, int idx){//idx表示当前下标 if(idx == s.size())原创 2020-12-11 20:20:21 · 705 阅读 · 0 评论 -
LeetCode第 861 题:翻转矩阵后的得分(C++)
861. 翻转矩阵后的得分 - 力扣(LeetCode)可以进行的操作是行变换或列变换,最终的目的是要使得最后的数字和最大。行变换只会影响一个数字(该行的数字)。由于矩阵的 0/1 呈现的是二进制格式(数字是按照行计算的),所以位1越靠右数字就会越大。不难得出,第一位不是1的数字(示例中最大为0111 = 7)肯定小于第一位是1的数字(示例中最小为1000 = 8 > 7),所以如果某一行的第一位不是1,那为达目的就需要进行行变换。相反地,如果第一位已经是1了,那就不能进行行变换了。进行完上面原创 2020-12-08 20:08:04 · 695 阅读 · 0 评论 -
LeetCode第 1370 题:上下升降字符串(C++)
1370. 上升下降字符串 - 力扣(LeetCode)题目有点难读懂,大体意思就是先升序再降序来回走,可以使用桶排序的思路:把不同的字母放在不同的桶里面,相同的字母放在同一个桶里面。假设桶为a--z,先从a桶出发,如果桶里面有元素,就取出一个(追加到res),一直走到z桶,此时又从z桶出发,向a桶的方向走,如此来回反复即可。class Solution {public: int count[26]; string sortString(string s) { for原创 2020-11-25 21:09:30 · 274 阅读 · 0 评论 -
LeetCode第 1030 题:距离顺序排列矩阵单元格(C++)
1030. 距离顺序排列矩阵单元格 - 力扣(LeetCode)其实就是定义一个排序规则的问题使用优先级队列class Solution {public: vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) { vector<vector<int>> res; //https://blog.csdn.net/qq_3252371原创 2020-11-17 11:21:41 · 203 阅读 · 0 评论 -
LeetCode第 406 题:根据身高重建队列(C++)
406. 根据身高重建队列 - 力扣(LeetCode)看标签是贪心算法的思路,可是为啥贪心就合理呢?虽然是中等难度,可是想好久没想出为啥…首先是先排序,按照第一个元素逆序,第二个元素正序,那么每一个元素之前的元素的个数,就是大于等于它的元素数量。个头高的人会忽略个头比它矮的人,只会在意个头大于等于它的人。样例:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]排序之后:[[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]原创 2020-11-16 22:10:30 · 763 阅读 · 0 评论 -
LeetCode第 514 题:自由之路(C++)
514. 自由之路 - 力扣(LeetCode)一开始感觉是要用贪心,后来发现贪心是错的。还是dp吧,详解可以看官方题解:自由之路 - 自由之路 - 力扣(LeetCode),还是比较好理解的。class Solution {public: int dp[110][110];//从前往后拼出key的第i个字符,ring 的第j个字符与12:00方向对齐的最少步数 int findRotateSteps(string ring, string key) { int m原创 2020-11-13 15:20:08 · 258 阅读 · 0 评论 -
LeetCode第 973 题:最接近原点的 K 个点(C++)
973. 最接近原点的 K 个点 - 力扣(LeetCode)topK问题,优先级队列的典型应用:class Solution {public: struct cmp{ bool operator()(const pair<int, int> &a, const pair<int, int> &b){ return a.first*a.first + a.second*a.second < b.first*原创 2020-11-09 11:32:56 · 316 阅读 · 0 评论 -
LeetCode第 1356 题:根据数字二进制下 1 的数目排序(C++)
1356. 根据数字二进制下 1 的数目排序 - 力扣(LeetCode)简单题,自己设计一个排序规则就可以了,可以使用bitset简化操作:class Solution {public: struct cmp{ bool operator()(int a, int b){ if(bitset<14>(a).count() == bitset<32>(b).count()) return a < b;//最大10^4原创 2020-11-06 15:33:16 · 317 阅读 · 0 评论 -
LeetCode第 45 题:跳跃游戏 (C++)
45. 跳跃游戏 II - 力扣(LeetCode)贪心算法的思路:注意数值代表的是可以跳跃的最大长度,也就是说是最多可以跳这么远,但是不跳这么远也行。看示例:[2,3,1,1,4]i= 0,第一次站在数字2的位置,最多可以跳两个,也就是活可以跳到3(下标1)的位置,也可以跳到1(下标2)的位置。那跳到哪个位置好呢?首先肯定会向哪儿的数值越大就跳到哪儿,但是这样不是很对,虽然这儿确实是跳到3的地方好。因为,3的位置相对与1的位置来说,3靠前一个身位,假设我跳到3,后续从3往后跳的时候,还是会经过原创 2020-11-03 22:10:44 · 804 阅读 · 0 评论 -
LeetCode第 44 题:通配符匹配 (C++)
44. 通配符匹配 - 力扣(LeetCode)相似的题目:LeetCode第 10 题:正则表达式匹配 (C++)_zj-CSDN博客dp思路都是一样的:class Solution {public: bool isMatch(string s, string p) { int m = s.size(), n = p.size(); vector<vector<int>> dp(m+1, vector<int>(n+1,原创 2020-11-03 20:58:30 · 350 阅读 · 0 评论 -
LeetCode第 941 题:有效的山脉数组(C++)
941. 有效的山脉数组 - 力扣(LeetCode)简单题,就直接遍历就可以了,方法也有很多种class Solution {public: bool validMountainArray(vector<int>& A) { int n = A.size(); if(n < 3) return false; int i = 0; while(i < n-1 && A[i]原创 2020-11-03 14:52:24 · 378 阅读 · 0 评论 -
LeetCode第 37 题:解数独(C++)
37. 解数独 - 力扣(LeetCode)相当于进阶:LeetCode第 36 题:有效的数独(C++)_zj-CSDN博客dfs枚举:class Solution {public: int row[9][9], col[9][9], block[9][9]; void solveSudoku(vector<vector<char>>& board) { for(int i = 0; i < 9; ++i){原创 2020-11-02 22:02:32 · 644 阅读 · 0 评论 -
LeetCode第 36 题:有效的数独(C++)
36. 有效的数独 - 力扣(LeetCode)关于行和列,使用哈希表记录就可以了。3x3的方格也是使用哈希表映射,但是怎样映射可以将一个块内的元素都映射到正确的位置呢?需要对横纵坐标进行一下变换。假设使用block[9][9]用来映射块,每一行代表一个3*3的方块,列下标对应数字,那么block[3][4] = true代表第四个方块中已经存在5(4+1)这个数字:上图中每一个方块映射到block数组中,对应的横坐标为:i/3 * 3 + j/3,i是行标,j是列标。行标决定一组block的起始原创 2020-11-02 16:55:26 · 446 阅读 · 0 评论 -
LeetCode第 29 题:两数相除(C++)
29. 两数相除 - 力扣(LeetCode)要求不使用乘法、除法和 mod 运算符,但是乘法、除法、mod都是可以使用加减进行模拟的,假设输入分别为15、3,res表示结果:15 > 3: res置为1(代表结果至少为1),3 += 3(翻倍)得到615 > 6: 比翻倍之后的数还要大,res置为2(1 += 1),6 += 6得到1215 > 12: res置为4,12 += 12得到2415 < 24,循环终止,此时的res为4,代表15里面至少有4个3,但是还没原创 2020-11-02 11:29:18 · 507 阅读 · 1 评论 -
LeetCode第 463 题:岛屿的周长(C++)
463. 岛屿的周长 - 力扣(LeetCode)很巧妙的思路:存在一个1就会产生四条边一旦相邻边的数量就会减少2:方格A和方格B相邻,方格A,B需要分别减少一条边class Solution {public: int res = 0; int islandPerimeter(vector<vector<int>>& grid) { int n = grid.size(), m = grid[0].size();原创 2020-10-30 21:06:27 · 400 阅读 · 0 评论 -
LeetCode第 129 题:求根到叶子节点数字之和(C++)
129. 求根到叶子节点数字之和 - 力扣(LeetCode)dfs遍历就可以了:class Solution {public: int res; void dfs(TreeNode* root, int cur){ if(!root->left && !root->right){ res += cur; return; } if(root->left)原创 2020-10-29 19:10:18 · 156 阅读 · 0 评论 -
LeetCode第 166 题:分数到小数(C++)
166. 分数到小数 - 力扣(LeetCode)参考;C++:模拟题(简单易懂) - 分数到小数 - 力扣(LeetCode)这种题真的很烦class Solution {public: string fractionToDecimal(int numerator, int denominator) { if(denominator == 0) return ""; if(numerator == 0) return "0"; st原创 2020-10-29 11:27:19 · 223 阅读 · 0 评论 -
LeetCode第 836 题:矩形重叠(C++)
836. 矩形重叠 - 力扣(LeetCode)类似:LeetCode第 223 题:矩形面积(C++)_zj-CSDN博客但是class Solution {public: bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) { if(rec1[0] >= rec2[2] || rec1[1] >= rec2[3] || rec1[2] <=原创 2020-10-24 21:53:00 · 493 阅读 · 0 评论 -
LeetCode第 223 题:矩形面积(C++)
223. 矩形面积 - 力扣(LeetCode)参考:简单的考虑 - 矩形面积 - 力扣(LeetCode)那么重叠的时候,重叠区域的边界:上边界,取两个矩形的上边界的最小值下边界,取两个矩形的下边界的最大值左边界,取两个矩形的左边界的最大值右边界,取两个矩形的右边界的最小值那么重叠区域的面积就容易计算了class Solution {public: int computeArea(int A, int B, int C, int D, int E, int原创 2020-10-24 21:35:31 · 399 阅读 · 0 评论 -
面试题 05.04. 下一个数
面试题 05.04. 下一个数 - 力扣(LeetCode)转化为bitset,然后再转为string,直接使用函数next_permutation()和prev_permutation(),感觉像是投机取巧。。。原创 2020-10-22 22:30:49 · 167 阅读 · 0 评论 -
LeetCode第 1299 题:将每个元素替换为右侧最大元素(C++)
1299. 将每个元素替换为右侧最大元素 - 力扣(LeetCode)class Solution {public: vector<int> replaceElements(vector<int>& arr) { int n = arr.size(); vector<int> res(n, -1); for(int i = n-2; i >= 0; --i){ if(arr原创 2020-10-22 21:39:31 · 184 阅读 · 0 评论 -
LeetCode第 228 题:汇总区间(C++)
228. 汇总区间 - 力扣(LeetCode)遍历就完事了,没啥好说的class Solution {public: vector<string> res; vector<string> summaryRanges(vector<int>& nums) { int l = 0, r = l, n = nums.size(); while(r < n){ while(r <原创 2020-10-22 20:44:50 · 188 阅读 · 0 评论 -
LeetCode第 162 题:寻找峰值(C++)
162. 寻找峰值 - 力扣(LeetCode)二分法:class Solution {public: //相邻的数只有两种情况: // nums[mid] > nums[mid + 1] 或 nums[mid] < nums[mid + 1] int findPeakElement(vector<int>& nums) { int l = 0, r = nums.size()-1; while(l < r原创 2020-10-22 19:46:26 · 391 阅读 · 0 评论 -
LeetCode第 414 题:第三大的数(C++)
414. 第三大的数 - 力扣(LeetCode)典型的topk,优先级队列,不过这儿需要处理重复元素,可以使用哈希表自动去重class Solution {public: int thirdMax(vector<int>& nums) { unordered_set<int> s(nums.begin(), nums.end()); int n = s.size(); if(n < 3) return原创 2020-10-20 23:48:11 · 351 阅读 · 0 评论 -
LeetCode第 445 题:两数相加 II(C++)
445. 两数相加 II - 力扣(LeetCode)这儿的顺序与正常的相加不一样,使用栈倒腾一下就可以了。class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { stack<int> s1, s2; while(l1){ s1.push(l1->val); l1 = l1->next;原创 2020-10-20 21:25:01 · 202 阅读 · 0 评论 -
LeetCode第 41 题:缺失的第一个正数(C++)
41. 缺失的第一个正数 - 力扣(LeetCode)要找的是第一个正数。使用换座位的思路,把每个正数放在它应该在的位置上去(1放在第一位,2放在第二位。。。)class Solution {public: int firstMissingPositive(vector<int>& nums) { int n = nums.size(); for(int i = 0; i < n; ++i){ while(nu原创 2020-10-20 20:45:40 · 348 阅读 · 0 评论 -
LeetCode第 165 题:比较版本号(C++)
165. 比较版本号 - 力扣(LeetCode)需要按照 .进行分割,c++里面分割最方便的就是使用stringstream了,可以首先将两个字符串的.的数量增加到一致(补0就可以了):class Solution {public: int compareVersion(string version1, string version2) { int cnt1 = count(version1.begin(), version1.end(), '.'); in原创 2020-10-20 14:52:23 · 450 阅读 · 0 评论 -
LeetCode第 328 题:奇偶链表(C++)
328. 奇偶链表 - 力扣(LeetCode)class Solution {public: ListNode* oddEvenList(ListNode* head) { if(!head || !head->next) return head; auto p1 = head, p2 = head->next, p3 =head->next; while(p1->next && p2->nex原创 2020-10-20 10:09:57 · 163 阅读 · 0 评论 -
LeetCode第 227 题:基本计算器 II(C++)
227. 基本计算器 II - 力扣(LeetCode)类似;面试题 16.26. 计算器_zj-CSDN博客class Solution {public: int calculate(string s) { stack<int> stk; int res = 0, cur = 0, n = s.size(); char c = '+';//记录上一次的符号 for(int i = 0; i <= n; ++i原创 2020-10-18 20:06:34 · 364 阅读 · 0 评论 -
LeetCode第 124 题:二叉树中的最大路径和(C++)
124. 二叉树中的最大路径和 - 力扣(LeetCode)注意数字可能为负值,而且不一定经过根节点,只要是相连的一条路径都可以,所以每个节点处都需要进行更新。和这题是类似的:LeetCode第 543 题:二叉树的直径(C++)_zj-CSDN博客对于某个根节点:搭配可以是:根,根+左,根+右,根+左+右。而该根节点返回回溯给上层父节点的值有两种选择:根,根+max(左,右)。class Solution {public: int res = INT_MIN; int maxP原创 2020-10-17 22:27:24 · 386 阅读 · 0 评论 -
LeetCode第 543 题:二叉树的直径(C++)
543. 二叉树的直径 - 力扣(LeetCode)求的是直径,这个直径的描述还是有点不好明白的:任意两个结点路径长度中的最大值。需要注意:直径不一定会过根节点,所以每个节点都有可能是直径的“支点”,计算的时候就需要不停的更新。class Solution {public: int res = 0; int diameterOfBinaryTree(TreeNode* root) { if(!root) return 0; dfs(root);原创 2020-10-17 21:52:52 · 408 阅读 · 0 评论 -
LeetCode第 32 题:最长有效括号(C++)
32. 最长有效括号 - 力扣(LeetCode)如果感觉不好理解的话,就用消消乐的思路去思考就知道怎么做了。栈处理栈是括号匹配常用的辅助结构了。维护一个标志位数组,记录不能匹配的括号的下标。一次遍历:如果是左括号:入栈如果是右括号:栈空的话说明该右括号无法匹配,标志位置位;栈非空的话直接出栈即可最后的标志位数组就是一串0/1的数组,只需要遍历记录最长的连续1的个数就可以了。class Solution {public: int flags[20000]; int l原创 2020-10-17 16:52:01 · 423 阅读 · 0 评论 -
LeetCode第 895 题:最大频率栈(C++)
895. 最大频率栈 - 力扣(LeetCode)需要考虑频率,那么可以把频率相同的数字存储在同一个数组(栈)里面;pop的时候,会优先pop频率最高的数字,那么可以使用哈希表记录每个数字的频率,形成<数字,频率>键值对;还需要一个变量,记录最大频率。push:首先是哈希表里面该数字对应的频率+1,然后该数字的频率变化了之后,需要考虑更新什么东西呢?最大频率更新该数字应当进入另一个栈(频率为之前的频率+1对应的那个栈)问题来了,需要将这个数字从它之前呆的栈里面删除吗?比如之原创 2020-10-16 22:26:06 · 439 阅读 · 0 评论 -
LeetCode第 718 题:最长重复子数组(C++)
718. 最长重复子数组 - 力扣(LeetCode)简单dp就行了:class Solution {public: int dp[1010][1010]; int findLength(vector<int>& A, vector<int>& B) { int m = A.size(), n = B.size(), res = 0; if(m == 0 || n == 0) return res;原创 2020-10-16 18:38:36 · 276 阅读 · 0 评论 -
LeetCode第 443 题:压缩字符串(C++)
443. 压缩字符串 - 力扣(LeetCode)从左到右进行读取。当读到最后一个字符,或者下一个下一个字符与当前不同时,则到达连续区块的结尾。当我们到达连续区块的结尾时,就从写入压缩的结果,过程总需要记录字符与个数。class Solution {public: int compress(vector<char>& chars) { int n = chars.size(), len = 0; for(int i = 0, cnt =原创 2020-10-15 22:00:07 · 463 阅读 · 0 评论 -
LeetCode第 31 题:下一个排列(C++)
31. 下一个排列 - 力扣(LeetCode)下一个排列 - 下一个排列 - 力扣(LeetCode)class Solution {public: void nextPermutation(vector<int>& nums) { int i = nums.size()-1; while(i > 0 && nums[i-1] >= nums[i]) --i;//从右到左寻找不满足大小关系的第一对数字原创 2020-10-15 21:27:35 · 366 阅读 · 0 评论 -
LeetCode第 47 题:全排列II(C++)
47. 全排列 II - 力扣(LeetCode)类似;LeetCode第 46 题:全排列(C++)_zj-CSDN博客只不过多了一个去重class Solution {public: vector<vector<int>> res; vector<int> flags;//标志位 vector<int> tmp; int n; void dfs(vector<int> &nums){原创 2020-10-15 21:10:09 · 212 阅读 · 0 评论 -
LeetCode第 46 题:全排列(C++)
46. 全排列 - 力扣(LeetCode)排列是顺序相关的。dfs直接枚举应该就可以了:class Solution {public: vector<vector<int>> res; vector<int> flags;//标志位 vector<int> tmp; int n; void dfs(vector<int> &nums){ if(tmp.size() == n原创 2020-10-15 21:00:17 · 325 阅读 · 0 评论 -
LeetCode第 516 题:最长回文子序列(C++)
516. 最长回文子序列 - 力扣(LeetCode)不像第五题:LeetCode第 5 题:最长回文子串(C++)_zj-CSDN博客这儿的回文子序列是不需要连续的。这题其实是dp的思路去做,不过这一题的dp有点特殊参考这儿的图;子序列问题通用思路|最长回文子序列 - 最长回文子序列 - 力扣(LeetCode)if (s[i] == s[j]) // 它俩一定在最长回文子序列中 dp[i][j] = dp[i + 1][j - 1] + 2;else // s[原创 2020-10-15 20:45:15 · 518 阅读 · 0 评论