自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(138)
  • 收藏
  • 关注

原创 LeetCode 39.组合总和 (搜索回溯 C/C++)

搜索回溯解决组合总和问题

2022-04-05 23:07:29 358

原创 HJ103 Redraiment的走法 (最长递增子序列,DP)C/C++

动态规划解决最长递增子序列问题

2022-03-22 21:35:22 717

原创 HJ108 求最小公倍数 (lcm gcd) C/C++

gcd、lcm

2022-03-22 16:24:23 893

原创 HJ107 求解立方根 泰勒+二分 两种解法 C/C++

泰勒和二分法求解立方根

2022-03-22 14:14:13 1113

原创 HJ20 密码验证合格程序 C/C++

字符串问题:密码验证合格程序

2022-03-21 12:12:54 551

原创 HJ17 坐标移动 C/C++

格式化字符串,解决坐标移动

2022-03-13 21:00:57 1609

原创 HJ6 质数因子 C/C++

短除法 分解质因数

2022-03-10 21:12:55 1242

原创 LeetCode 28.实现strStr() 朴素模式匹配+KMP C/C++

字符串模式匹配算法问题 ,通过朴素模式匹配和KMP解决。

2022-02-10 18:47:16 523

原创 LeetCode 27.移除元素 三种解法 C/C++

暴力/双指针解决移除元素问题

2022-01-05 23:17:19 541

原创 LeetCode 18.四数之和 剪枝+排序+双指针 C/C++

剪枝+排序+双指针解决四数之和问题

2022-01-03 23:43:52 409

原创 LeetCode 17.电话号码的字母组合 回溯法 C/C++

回溯法解决电话号码的字母组合问题

2022-01-02 23:43:58 301

原创 LeetCode 15.三数之和 排序+双指针 C/C++

排序+双指针解决三数和问题,时间复杂度O(n^2)

2022-01-01 16:06:35 321

原创 LeetCode 1.两数之和 C/C++ 哈希表

LeetCode两数之和,哈希表,O(n)复杂度

2021-12-28 21:17:12 628

原创 LeetCode 199二叉树的右视图 题解 C/C++

主要思路方法一:深搜维护一个map映射,key为树的高度,value为对应层数(高度)的最右值。在维护一个结点栈和深度栈,这两个栈也是一一对应的关系,结点与他的高度。算法主要流程就是从根节点开始搜索,每次优先访问右子树,那么这一层的最右节点就是它。若没有右子树则访问左子树,对左子树在执行上述操作。用栈模拟该过程即可,先将左子树入栈,再将右子树入栈,然后栈顶元素出栈,优先处理的就是右子树。方法二:广搜对二叉树进行层次遍历,从左到右,每层最后遍历的即为最右边结点,用队列实现,不断更新每一层最右结

2021-06-14 15:58:21 117

原创 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 174

原创 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 172

原创 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 235

原创 LeetCode 1130. 叶值的最小代价生成树 题解 C/C++

主要思路注意本题的说明“数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应”,所以说和哈夫曼树还是有一定区别的。维护一个单调递减找,栈顶元素是最小的(不太严谨),每遍历到一个大于栈顶元素的值时,就将栈顶元素出栈,同时比较此时栈顶元素与当前元素的大小,将较小者与出栈的元素相乘即非叶节点的值。class Solution {public: int mctFromLeafValues(vector<int>& arr) { int len = arr.si

2021-05-23 23:34:21 134

原创 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 152

原创 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 248

原创 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 80

原创 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 134

原创 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 234

原创 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 194

原创 LeetCode 901. 股票价格跨度 题解 C/C++

主要思路单调栈求出小于或等于今天价格的最大连续日数等价于求出最近的一个大于今日价格的日子。我们用单调栈维护一个单调递减的价格序列,并且对于每个价格,存储一个 weight 表示它离上一个价格之间(即最近的一个大于它的价格之间)的天数。当栈为空或者栈顶价格大于当前价格时直接入栈,否则循环弹出栈顶元素,直到栈中价格大于当前价格,同时累加弹出价格对应的连续天数,结果就是当前价格的连续天数,最后入栈,详见代码。class StockSpanner {private: stack<pair&l

2021-05-12 00:38:56 269

原创 LeetCode #895. 最大频率栈 题解 C/C++

主要思路1.维护一个map映射,map<int,int>freq;为元素x到该元素出现的频率;即key为元素x,value为该元素出现的次数。2.在维护一个 频率到具有该频率元素集合的映射,map<int,stack>group;即key值为频率,value为一个栈,其中存放具有该频率的元素,这样就满足了“如果最频繁的元素不只一个,则移除并返回最接近栈顶的元素”这一要求。3.最后始终维护一个全局变量max_freq记录最大频率.class FreqStack {priv

2021-05-11 23:49:59 122

原创 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 130

原创 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 186

原创 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 89

原创 LeetCode 739. 每日温度 题解 C/C++

主要思路方法一:暴力维护一个数组 tf[],始终存储每个温度第一次出现的下标.从后向前遍历,对每一个温度T[i],在tf中找T[i]+1到100的第一次出现的最小下标,减去 i 即是要等待的天数,这样可行的原因是我们是从后向前遍历的,tf[]存储的下标始终是在i之后的.方法二:单调栈维护一个栈,其中存储的是温度数组下标从前往后遍历,当前温度高于栈顶温度时,说明栈顶温度的下一个更高的温度就是当前温度,栈顶元素出栈即可,他已经找到了,重复上述操作,直到栈为空或者栈顶温度大于等于当前温度;如果

2021-05-07 17:11:00 196

原创 LeetCode 735. 行星碰撞 题解 C/C++

主要思路首先想到要用栈,这里用动态数组模拟栈,栈为空或者前面的行星都是向左移动,则后面的行星不管向哪边移动都不会与前面的相撞,直接入栈即可如果前面的行星向右移动,后面的也向右移动也不会相撞,直接入栈即可只有前面的行星向右移动,后面的向左移动才会相撞,之后循环比较当前行星的质量与栈顶行星的质量,如果绝对值相等则双方都销毁,栈顶出栈,如果当前行星的质量大,则栈顶出栈,当前行星继续与栈顶行星比较,如果栈顶质量大,则当前行星爆炸,跳出循环,继续遍历后续元素。class Solution {publi

2021-05-07 14:50:34 440

原创 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 156

原创 LeetCode 636. 函数的独占时间 题解 C/C++

主要思路设置一个栈,其中的类型是一个对组,key为标识符,value为对应的时间戳。遇到start直接入栈,end的话当前进程的时间戳减去栈顶元素的时间戳即是持续时间,栈顶元素出栈,如果栈非空,要把栈顶元素的持续时间减去刚才出栈元素的持续时间(假设它一直在独占时间),之后遇到它自己的end时,直接end的时间戳减去start的时间戳累积到自己的持续时间即是最终的独占时间。因为是单线程,子进程完成后父进程才可能完成,具体看代码吧。class Solution {public: vector&

2021-05-01 16:53:50 114

原创 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 130

原创 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 349

原创 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 103

原创 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&&amp

2021-04-27 23:37:42 97

原创 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 398

原创 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 99

原创 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 85

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除