LeetCode
【止心】
这个作者很懒,什么都没留下…
展开
-
LeetCode 39.组合总和 (搜索回溯 C/C++)
搜索回溯解决组合总和问题原创 2022-04-05 23:07:29 · 406 阅读 · 0 评论 -
LeetCode 28.实现strStr() 朴素模式匹配+KMP C/C++
字符串模式匹配算法问题 ,通过朴素模式匹配和KMP解决。原创 2022-02-10 18:47:16 · 571 阅读 · 0 评论 -
LeetCode 27.移除元素 三种解法 C/C++
暴力/双指针解决移除元素问题原创 2022-01-05 23:17:19 · 645 阅读 · 0 评论 -
LeetCode 18.四数之和 剪枝+排序+双指针 C/C++
剪枝+排序+双指针解决四数之和问题原创 2022-01-03 23:43:52 · 429 阅读 · 0 评论 -
LeetCode 17.电话号码的字母组合 回溯法 C/C++
回溯法解决电话号码的字母组合问题原创 2022-01-02 23:43:58 · 341 阅读 · 0 评论 -
LeetCode 15.三数之和 排序+双指针 C/C++
排序+双指针解决三数和问题,时间复杂度O(n^2)原创 2022-01-01 16:06:35 · 401 阅读 · 0 评论 -
LeetCode 1.两数之和 C/C++ 哈希表
LeetCode两数之和,哈希表,O(n)复杂度原创 2021-12-28 21:17:12 · 700 阅读 · 0 评论 -
LeetCode 199二叉树的右视图 题解 C/C++
主要思路方法一:深搜维护一个map映射,key为树的高度,value为对应层数(高度)的最右值。在维护一个结点栈和深度栈,这两个栈也是一一对应的关系,结点与他的高度。算法主要流程就是从根节点开始搜索,每次优先访问右子树,那么这一层的最右节点就是它。若没有右子树则访问左子树,对左子树在执行上述操作。用栈模拟该过程即可,先将左子树入栈,再将右子树入栈,然后栈顶元素出栈,优先处理的就是右子树。方法二:广搜对二叉树进行层次遍历,从左到右,每层最后遍历的即为最右边结点,用队列实现,不断更新每一层最右结原创 2021-06-14 15:58:21 · 141 阅读 · 0 评论 -
LeetCode 1673找出最具竞争力的子序列 题解 C/C++
始终维护一个单调递增栈即可,需要注意的是删除栈顶元素的时候要确保剩余的元素加上此时栈中的元素个数大于k,否则不能删除栈顶元素。栈中元素个数等于k时,当前遍历元素无需入栈,否则直接入栈,自己可以找一组数据模拟一下,加深理解体会,详见代码。//递增栈class Solution {public: vector<int> mostCompetitive(vector<int>& nums, int k) { vector<int> inc_s.原创 2021-06-07 00:18:37 · 207 阅读 · 0 评论 -
LeetCode 1541 平衡括号字符串的最少插入次数 题解 C/C++
参考链接class Solution {public: int minInsertions(string s) { int insCnt = 0; int leftCnt= 0; int len = s.length(); int idx = 0; while(idx<len) { if(s[idx]=='(') { leftCnt++; idx++; } else {//是右括号 if(leftCnt>0) {//还有未匹配的原创 2021-06-05 18:18:43 · 208 阅读 · 0 评论 -
LeetCode 1190. 反转每对括号间的子串 题解 C/C++
主要思路逐层翻转,并将翻转结果链入栈尾,重复此操作。遍历字符串,左括号或者字母则直接入栈,遇到右括号,循环弹出栈顶元素直至遇到左括号,弹出的栈顶元素加入到队列中,最后将队列中的元素在重新插入到栈中,其实就是完成某一子串的翻转,用reverse也行,就不用队列了。最后栈中即为最终结果。class Solution {public: string reverseParentheses(string s) { int len = s.length(),t; string s原创 2021-05-24 00:11:05 · 257 阅读 · 0 评论 -
LeetCode 1130. 叶值的最小代价生成树 题解 C/C++
主要思路注意本题的说明“数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应”,所以说和哈夫曼树还是有一定区别的。维护一个单调递减找,栈顶元素是最小的(不太严谨),每遍历到一个大于栈顶元素的值时,就将栈顶元素出栈,同时比较此时栈顶元素与当前元素的大小,将较小者与出栈的元素相乘即非叶节点的值。class Solution {public: int mctFromLeafValues(vector<int>& arr) { int len = arr.si原创 2021-05-23 23:34:21 · 185 阅读 · 0 评论 -
LeetCode 1124. 表现良好的最长时间段 题解 C/C++
类比LeetCode 962. 最大宽度坡 计大于8小时为1,否则为0,生成前缀和数组,该前缀和数组就是962题中给定的数组,计算最大宽度,方法类似。//前缀和+单调栈class Solution {public: int longestWPI(vector<int>& hours) { int len = hours.size(); vector<int> prefix_sum(len+1,0);//前缀和,第一个是0 f原创 2021-05-22 23:01:54 · 183 阅读 · 0 评论 -
LeetCode 962. 最大宽度坡 题解 C/C++
主要思路1.假设两个指针i,j, i指向数组头部,j指向数组尾部,我们要做的就是使i尽可能小,j尽可能大时,满足j指向的元素大于等于i指向的元素,此时j-i即最大宽度。2.所以我们从左往右遍历数组,利用单调栈,栈中存的是元素的下标,下标所对应的元素严格递减,最后栈顶元素就是最小元素。3.最后我们从后往前遍历数组,如果大于等于当前栈顶所对应的元素,那么更新结果,并将栈顶元素出栈,重复此过程。参考链接/*根据题意需要找出最大宽,首先要求i < j,即i尽可能的小,j尽可能的大;很容易想到原创 2021-05-22 22:29:26 · 284 阅读 · 0 评论 -
LeetCode 1021. 删除最外层的括号 题解 C/C++
/*记录括号的层数,大于等于1说明后续的字符都可以输出,遇到右括号时层数减1本题的意思就是自己的外面只要有一层括号,自己就可以输出*/using namespace std;class Solution {public: string removeOuterParentheses(string s) { if(s=="()"||s=="")return ""; int cnt = 0;//统计括号层数,大于等于1则说明里面的括号都可以输出 string s原创 2021-05-21 21:29:32 · 114 阅读 · 0 评论 -
LeetCode 1003. 检查替换后的词是否有效 题解 C/C++
主要思路1.字符串s是由不断地给字符串t(初始为空)插入字符串"abc"构成的(插入位置随机),所以我们反向考虑,不断在字符串s中去除连续的"abc",如果最后为空,说明就是有效的。2. 具体做法就是遍历字符串s,每遇到一段连续的"abc"字段就把他们删除,然后对重新组成的字符串在执行上述操作。比如字符串s = “aabcabcbc”,我们先删除第一段连续的abc,即s[1]至s[3],删除后s成了"aabcbc",在删除连续的abc,剩余的字符串成了abc,最后删除,字符串成了空,说明就是有效的。原创 2021-05-20 23:05:08 · 205 阅读 · 0 评论 -
LeetCode 921. 使括号有效的最少添加 题解 C/C++
主要思路始终维护一个栈,遇到左括号直接入栈,遇到右括号时,如果栈顶元素为左括号说明可与之匹配,不需要添加,将左括号出栈即可,否则需要添加左括号来配对当前的右括号,ans++,最后结果需要加上栈中剩余的元素个数(都是没有配对的左括号)。class Solution {public: int minAddToMakeValid(string s) { if(s.empty()||s=="()")return 0; stack<char> stk; in原创 2021-05-14 00:04:44 · 276 阅读 · 0 评论 -
LeetCode 907. 子数组的最小值之和 题解 C/C++
//单调栈class Solution {private: const int BASE = 1e9+7;public: int sumSubarrayMins(vector<int>& arr) { int n = arr.size(); stack<int> inc_stk; vector<int> ans(n,0); for(int i = 0;i<n;i++) {原创 2021-05-13 23:45:46 · 246 阅读 · 0 评论 -
LeetCode 901. 股票价格跨度 题解 C/C++
主要思路单调栈求出小于或等于今天价格的最大连续日数等价于求出最近的一个大于今日价格的日子。我们用单调栈维护一个单调递减的价格序列,并且对于每个价格,存储一个 weight 表示它离上一个价格之间(即最近的一个大于它的价格之间)的天数。当栈为空或者栈顶价格大于当前价格时直接入栈,否则循环弹出栈顶元素,直到栈中价格大于当前价格,同时累加弹出价格对应的连续天数,结果就是当前价格的连续天数,最后入栈,详见代码。class StockSpanner {private: stack<pair&l原创 2021-05-12 00:38:56 · 315 阅读 · 0 评论 -
LeetCode 880. 索引处的解码字符串 题解 C/C++
主要思路当一段字符串重复很多次时,不管k多大,结果都和k = k%size是一样的,举个例子:S = “apple5”;解码后的字符串是appleapple…一共重复5次,长度为25,当k = 24时,k%5 = 4,也就是k=4和k=24结果是一样的,都是字符 l我们首先求出解码后字符串的长度,然后从后往前遍历原字符串,如果遇到的是数字n,则当前解码后字符串的长度decLen除以n的结果就是前一阶段字符串的长度;也就是说前一段字符串重复了n次得到当前解码后的字符串;比如原字符串s = apple5,原创 2021-05-11 00:16:17 · 170 阅读 · 0 评论 -
LeetCode 856. 括号的分数 题解 C/C++
左括号直接入栈,遇到右括号时,如果栈顶元素是左括号,即是(),则分数是1,将左括号出栈,分数1入栈,如果栈顶元素是分数,则循环出栈,累加即是分数,最后结果乘2,再将对应的左括号出栈,结果入栈,重复上述操作,最后累加栈中分数即是最终结果。class Solution {public: int scoreOfParentheses(string S) { stack<int> stk;//记'('为-1 for(char ch:S) { if(ch=='(') { s.原创 2021-05-08 21:47:30 · 271 阅读 · 0 评论 -
LeetCode 844. 比较含退格的字符串 题解 C/C++
遇到字符入栈,遇到’#’,栈顶元素出栈class Solution {public: string fun(string str) { string ret = ""; for(char ch:str) { if(ch!='#') { ret.push_back(ch); } else if(!ret.empty()) { ret.pop_back(); } } return ret; } bool backspaceCompare(st.原创 2021-05-07 22:37:45 · 106 阅读 · 0 评论 -
LeetCode 739. 每日温度 题解 C/C++
主要思路方法一:暴力维护一个数组 tf[],始终存储每个温度第一次出现的下标.从后向前遍历,对每一个温度T[i],在tf中找T[i]+1到100的第一次出现的最小下标,减去 i 即是要等待的天数,这样可行的原因是我们是从后向前遍历的,tf[]存储的下标始终是在i之后的.方法二:单调栈维护一个栈,其中存储的是温度数组下标从前往后遍历,当前温度高于栈顶温度时,说明栈顶温度的下一个更高的温度就是当前温度,栈顶元素出栈即可,他已经找到了,重复上述操作,直到栈为空或者栈顶温度大于等于当前温度;如果原创 2021-05-07 17:11:00 · 258 阅读 · 0 评论 -
LeetCode 735. 行星碰撞 题解 C/C++
主要思路首先想到要用栈,这里用动态数组模拟栈,栈为空或者前面的行星都是向左移动,则后面的行星不管向哪边移动都不会与前面的相撞,直接入栈即可如果前面的行星向右移动,后面的也向右移动也不会相撞,直接入栈即可只有前面的行星向右移动,后面的向左移动才会相撞,之后循环比较当前行星的质量与栈顶行星的质量,如果绝对值相等则双方都销毁,栈顶出栈,如果当前行星的质量大,则栈顶出栈,当前行星继续与栈顶行星比较,如果栈顶质量大,则当前行星爆炸,跳出循环,继续遍历后续元素。class Solution {publi原创 2021-05-07 14:50:34 · 556 阅读 · 0 评论 -
LeetCode 682. 棒球比赛 题解 C/C++
class Solution {public: int calPoints(vector<string>& ops) { int ans = 0; vector<int> stk; int len = ops.size(); int p = 0;//始终指向栈的末尾 for(int i = 0;i<len;i++) { if(ops[i]!="+"&&ops[i]!="D"&&ops[i]!="C") {原创 2021-05-01 20:38:25 · 223 阅读 · 0 评论 -
LeetCode 636. 函数的独占时间 题解 C/C++
主要思路设置一个栈,其中的类型是一个对组,key为标识符,value为对应的时间戳。遇到start直接入栈,end的话当前进程的时间戳减去栈顶元素的时间戳即是持续时间,栈顶元素出栈,如果栈非空,要把栈顶元素的持续时间减去刚才出栈元素的持续时间(假设它一直在独占时间),之后遇到它自己的end时,直接end的时间戳减去start的时间戳累积到自己的持续时间即是最终的独占时间。因为是单线程,子进程完成后父进程才可能完成,具体看代码吧。class Solution {public: vector&原创 2021-05-01 16:53:50 · 168 阅读 · 0 评论 -
LeetCode 503. 下一个更大元素 II 题解 C/C++
#include <iostream>#include <cstdio>#include <vector>#include <stack>#include <algorithm>#include <set>#include <map>//503. 下一个更大元素 II//https://leetcode-cn.com/problems/next-greater-element-ii/using namesp原创 2021-04-29 23:22:12 · 190 阅读 · 0 评论 -
LeetCode 496. 下一个更大元素 I 题解 C/C++
方法一:暴力对于每一个nums1,先在nums2中找到它,然后向右遍历找到第一个大于nums1[i]的元素.方法二:单调栈根据题意,数组 nums1 视为询问。我们可以:先对 nums2 中的每一个元素,求出它的右边第一个更大的元素;将上一步的对应关系放入哈希表(HashMap)中;再遍历数组 nums1,根据哈希表找出答案。具体步骤就是:当我们遇到一个新的元素 nums2[i] 时,我们判断栈顶元素是否小于 nums2[i],如果是,那么栈顶元素的下一个更大元素即为 nums2[i],我们将栈.原创 2021-04-29 21:00:01 · 422 阅读 · 0 评论 -
LeetCode 456. 132 模式 题解 C/C++
//枚举3/*左边不断维护一个最小值,将右边的所有元素加入有序集合中判断是否符合132标准*/class Solution {public: bool find132pattern(vector<int> &nums) { int len = nums.size(); if(len<3)return false; multiset<int> right_all;//右侧所有元素 int left_min = nums[0];//存储左侧最小原创 2021-04-29 19:34:18 · 122 阅读 · 0 评论 -
LeetCode 402. 移掉K位数字 题解 单调栈 C/C++
/*402. 移掉K位数字https://leetcode-cn.com/problems/remove-k-digits/*/class Solution {public: string removeKdigits(string num,int k) { vector<char> stk; for(string::iterator it = num.begin();it!=num.end();it++) { while(stk.size()>0&&原创 2021-04-27 23:37:42 · 128 阅读 · 0 评论 -
LeetCode 394. 字符串解码 题解 C/C++
遍历字符串数字入栈,左括号入栈,字符入栈遇到右括号开始出栈,一直到对应左括号出栈出栈序列翻转后拼成一个字符串,此时栈顶即是该字符串的重复次数构建新的字符串入栈,重复以上操作。class Solution {public: string getDigits(string s,size_t *ptr) { string str = ""; while(isdigit(s[*ptr])) { str.push_back(s[(*ptr)++]); } return str.原创 2021-04-27 00:02:38 · 478 阅读 · 0 评论 -
LeetCode 341. 扁平化嵌套列表迭代器 题解 C/C++
class NestedIterator {private: vector<int> ans; //vector<int>::iterator cur; int idx; void dfs(const vector<NestedInteger> &nestedList) { for(auto it:nestedList) { if(it.isInteger())ans.push_back(it.getInteger()); else df原创 2021-04-26 20:06:48 · 135 阅读 · 0 评论 -
LeetCode 331. 验证二叉树的前序序列化 题解 C/C++
class Solution {public: bool isValidSerialization(string preorder) { int len = preorder.length(); int i = 0; stack<int> stk; stk.push(1); while(i<len) { if(stk.empty()) { return false; } if(preorder[i]==',')i++; else if原创 2021-04-26 15:19:56 · 127 阅读 · 0 评论 -
LeetCode 316. 去除重复字母&1081. 不同字符的最小子序列 题解 C/C++
在每次入栈的时候判断栈顶元素的字典序是否比待插入的元素大,大的话需要判断栈顶元素的剩余数量,如果没有了则不能出栈,否则出栈,不断维护单调栈,整体呈现非递减序列。//单调栈class Solution {public: string removeDuplicateLetters(string s) { //记得初始化为0 vector<int> vis(30);//标记栈中是否已经存在了该字符 vector<int> num(30);//字符串中每个字符的数量.原创 2021-04-23 19:29:17 · 194 阅读 · 0 评论 -
LeetCode 232. 用栈实现队列 题解 C/C++
主要思想就是 压入栈1的元素在输出到栈2中,元素的排列就成了队列了class MyQueue { stack<int > inStk,outStk; void fun() { while(!inStk.empty()) { outStk.push(inStk.top()); inStk.pop(); } }public: /** Initialize your data structure here. */ MyQueue() { }.原创 2021-04-23 00:28:39 · 140 阅读 · 0 评论 -
LeetCode 227. 基本计算器 II 题解 C/C++
将每个数字和符号分开看,维护一个标识preSign始终表示数字前面的运算符号,在维护一个栈,正数直接入栈,负数加一个 - 号后入栈,乘除与栈顶元素直接运算并更新其值。最后栈中存的就是每一部分的运算结果,相加即可得出最终答案。class Solution {public: int calculate(string s) { int len = s.length(); int num = 0; char preSign = '+';//表示该数字前面的符号 vector<int&.原创 2021-04-21 21:06:19 · 220 阅读 · 0 评论 -
LeetCode 225. 用队列实现栈 题解 C/C++
主要思路就是将先入队的元素转变为后入队,队头为栈顶,队尾为栈底。方法一:使用两个队列q1,q2,先将元素入队到q2,然后将q1的元素插入到q2中,最后q1与q2互换,q1队头为栈顶,队尾为栈底。方法二:使用一个队列,先将元素插入到队列中,然后将原来的元素重新插入到队列中,达到后进的元素始终在队头的效果。/*入栈时,首先将元素入队到q2,然后将q1的全部元素出队到q2最后互换q1,q2; q1的前端和后端分别对应栈顶和栈底队列是先进先出,栈是先进后出所以我们主要就是将先入队的元素借助辅助队列.原创 2021-04-21 16:55:14 · 194 阅读 · 0 评论 -
LeetCode 224. 基本计算器 题解 C/C++
每个数字本身是不会变的,我们只需要控制好它前面的符号。一开始默认符号为正,向栈中压入数字1表示正数,接着遍历字符串,遇到+时,符号保持原样即可,不需要改变,遇到 - 号时符号取负,遇到左括号时我们需要将此时的符号入栈,因为它是控制括号内数字符号的,遇到右括号时将控制该对括号内数字的符号出栈,最后如果是数字则进行计算。class Solution { public: int calculate(string s) { int len = s.length(); int i = 0,sign .原创 2021-04-21 15:09:08 · 225 阅读 · 0 评论 -
LeetCode 173. 二叉搜索树迭代器 题解 C/C++
题目连接struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode():val(0),left(nullptr),right(nullptr){} TreeNode(int x):val(x),left(nullptr),right(nullptr){} TreeNode(int x,TreeNode *left,TreeNode *right):val(x),left(left),right(right){}};原创 2021-04-19 23:35:51 · 280 阅读 · 0 评论 -
LeetCode 155. 最小栈 题解 C/C++
设置一个辅助栈,与元素栈同步插入与删除;一开始向辅助栈中插入一个很大的值,在向元素栈中插入数据的同时,也向辅助栈中插入,但插入的是该元素与辅助栈中栈顶元素两者的较小值,这样就形成了一种一一对应的关系,出栈的时候,两个栈一同出,任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。//两个栈是一一对应的,每个元素在辅助栈中对应的都是此时栈中最小的元素值class MinStack{private: stack<int> x_stack; stack<int> min_.原创 2021-04-19 22:30:17 · 167 阅读 · 0 评论