![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcodeg回顾
梅杏柿
这个作者很懒,什么都没留下…
展开
-
Leetcode第11题 盛最多水的容器 C++解法
双指针,双指针,想到双指针也没写出来。class Solution {public: int maxArea(vector<int>& height) { int length=height.size(); int i=0,j=length-1; int res=(j-i)*min(height[i],height[j]); while(i<j){ int left=(j-i-1)*原创 2021-03-08 09:29:25 · 130 阅读 · 0 评论 -
Leetcode第131题 分割回文串 C++解法
回溯,记忆化回文字符串class Solution {public: vector<vector<string>> res; //建立回文串的备忘录 vector<vector<int>> memo; //确认是否回文 bool isstring(string &s,int &i,int &j){ if(memo[i][j]!=-1) return m原创 2021-03-07 11:09:21 · 170 阅读 · 0 评论 -
Leetcode第514题 自由之路C++解法
先递归吧。果不其然,字符串的时候就超时了。毕竟是指数级。class Solution {public: int findDis(string& ring,int pos,string& key,int pmove) { int m=ring.size(),n=key.size(); if(pmove==n) return 0; if(ring[pos]==key[pmove])原创 2021-02-22 13:02:06 · 131 阅读 · 1 评论 -
Leetcode第1312题 让字符串成为回文串的最少插入次数C++解法
刚做过编辑距离的,我就想直接复制一个反转字符串,然后这两个字符串相同,前几个还可以的,但是到“leetcode”这个时,就不行了。仔细想这两个问题还是不等价,72题中的编辑距离中的操作包括更改操作,但是本题中的操作只有插入,所以果然不行。然后我又想从两边向中间靠拢,leetcode倒是通过了,第18个案例"zjveiiwvc"就通不过了class Solution {public: int minInsertions(string s) { int n=s.size();原创 2021-02-21 19:42:42 · 294 阅读 · 0 评论 -
Leetcode第312题 戳气球C++解法
事实证明,我还是不会做……没有任何逻辑推导,这是硬做啊class Solution {public: int maxCoins(vector<int>& nums) { int n=nums.size(),res=0; if(n==1) return nums[0]; if(n==2) return nums[0]*nums[1]+(nums[0]>nums[1]?nums[原创 2021-02-21 10:06:03 · 173 阅读 · 0 评论 -
Leetcode第887题 鸡蛋掉落C++解法
经典问题,想了一个小时无果,只能看答案。当然自己还是菜,连递归都没想出来。总结就是看第i层的鸡蛋是否碎了,碎了的话,就往下扔,但是鸡蛋要少一个,没碎的话楼层就往上,鸡蛋不变。不管结果如何,最终的结果是要包含所有情况,所以要取最大值。但是不管往上还是往下,扔的次数都加一。但是怎么选i?那就是枚举了,通过枚举我们找出最佳楼层(也就是最小值)class Solution {public: int superEggDrop(int K, int N) { if(N<=1)原创 2021-02-20 17:58:25 · 456 阅读 · 0 评论 -
Leetcode第18题四数之和 C++解法
跟三数和一样,我还以为有什么高端解法……class Solution {public: vector<vector<int>> fourSum(vector<int>& nums, int target) { int size=nums.size(); if(size<4) return {}; vector<vector<int>> res;原创 2021-02-19 11:00:19 · 156 阅读 · 0 评论 -
Leetcode第15题 三数和C++解法
排序加hash,O(n^2)复杂度class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { int size=nums.size(); if(size<3) return {}; sort(nums.begin(),nums.end()); unordered_map<int,int&原创 2021-02-19 10:34:27 · 128 阅读 · 0 评论 -
Leetcode第986题 区间列表的交集C++解法
早上起来突然就想通了,昨晚一开始是分情况讨论,把情况分的很细,主要是处理++i和++j的情况。发现太多情况了,于是想着把两个合并,然后一遍遍历。早上起来突然想到,把合并和i、j的递增分开处理class Solution {public:vector<vector> intervalIntersection(vector<vector>& firstList, vector<vector>& secondList) {int len_f=firs原创 2021-02-19 08:16:35 · 245 阅读 · 0 评论 -
Leetcode第56题 合并区间C++解法
class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) { vector<vector<int> > res; sort(intervals.begin(),intervals.end(),[](const auto& u,const auto& v)原创 2021-02-18 23:03:05 · 171 阅读 · 1 评论 -
Leetcode第1288题 删除被覆盖区间C++解法
跟435题一样,都是先排序。class Solution {public: int removeCoveredIntervals(vector<vector<int>>& intervals) { int size=intervals.size(); if(size<2) return 0; sort(intervals.begin(),intervals.end(),[] (const auto&原创 2021-02-18 22:47:55 · 91 阅读 · 0 评论 -
Leetcode第309、714题 买卖股票的最佳时机C++解法
动态规划class Solution {public: int maxProfit(vector<int>& prices) { int n=prices.size(); if(n<2) return 0; int buy[n],sell[n],froze[n]; buy[0]=-prices[0],sell[0]=0,froze[0]=0; for(int i=1;i<n;++i)原创 2021-02-18 17:23:21 · 58 阅读 · 0 评论 -
Leetcode第123、188题 买卖股票的最佳时机 C++解法
都是用动态规划去做;123题class Solution {public: int maxProfit(vector<int>& prices) { int size=prices.size(); int buy1=-prices[0],sell1=0,buy2=-prices[0],sell2=0; for(int i=1;i<size;++i) { sell2=max(sell原创 2021-02-18 12:21:44 · 110 阅读 · 0 评论 -
Leetcode第567题 字符串的排列 C++解法
笨蛋解法class Solution {public: bool checkInclusion(string s1, string s2) { unordered_map<char,int> target,window; int pl=0,pr=0,size=s2.size(),flag=0,len=s1.size(); for(char c:s1) target[c]++; for(;pr<size;pr++)原创 2021-02-17 20:55:00 · 123 阅读 · 1 评论 -
Leetcode第76题 最小覆盖子串 C++解法
双指针解法第一遍有问题,对进入内层循环的判断不对。我只考虑了窗口和目标的大小,也就是元素个数是否相同,但是没有考虑每个字符对应的value是否相同,只考虑了是否包含相同的key。class Solution {public: string minWindow(string s, string t) { unordered_map<char,int> target; for(char c:t) target[c]++; unordere原创 2021-02-17 19:02:10 · 182 阅读 · 0 评论 -
Leetcode第222题 完全二叉树的节点个数 C++解法
只说O(log2N)的思路,常规DFS和BFS都是O(N)。我思考了下,但是代码没写完。但是细细一考虑发现复杂度还是O(N),只是除了最坏情况不用遍历而已了。我的思路是先走左子树求出深度。然后按中序遍历思路,去找最下层的结点:只要是在执行内层循环语句之后(必须进入内层循环),发现深度和原来的深度不一样,说明就走到了。最后累加即可。但是写不出来,因为缺少一个执行完循环才会执行的语句(我印象是有,但是想不起来了,只有有这个才能判断,才能执行)。刚刚想到可以用一个bool变量判断;但是还是不行class原创 2021-02-07 10:42:57 · 163 阅读 · 0 评论 -
Leetcode第236题 二叉树的最近公共祖先
先用笨蛋方法去做,用栈记录每一个结点的路径;然后对比两个栈,有栈为空,或者栈顶元素不相等时就返回上一个栈顶值;class Solution {public: void findnode(TreeNode* root,TreeNode* &p,stack<TreeNode*> &fv,bool &f) { if(root==NULL) return; findnode(root->left,p,fv原创 2021-02-05 20:16:59 · 72 阅读 · 0 评论 -
Leetcode第450 删除二叉搜索树中的节点 C++解法
删除结点的话,假设找到的结点为X;需要处理X和父节点之间的关系,我之前直接删除叶子结点就是这里错了,直接删除造成内存泄露。用递归去做的话,这个结点本身是叶子结点或单边结点,那么在递归的返回值可以解决这个问题,直接返回null或另一边地址即可。但如果是左右结点都在,有两种操作方式,(我们这里都去找该结点的后继结点Y,也就是该结点的右孩子的最左孩子)第一种,让X的左结点挂到原来Y的左结点上,同时返回X的右节点即可;第二种,用Y的值去替代X的值,同时将问题转化为删除Y。递归去做class Soluti原创 2021-02-05 18:10:31 · 101 阅读 · 0 评论 -
Leetcode第230题 二叉搜索树中第K小的元素 C++解法
问题实际上是中序遍历,但我还是犯迷了一会class Solution {public: TreeNode* res=NULL; int i=0; void findk(TreeNode *root ,int k) { if(!root) return; findk(root->left,k); //递归方法在找到之后仍然会遍历,所以加上下面一句可以起到提前中断的效果,注意要在i++之前;原创 2021-02-05 08:56:48 · 134 阅读 · 0 评论 -
Leetcode第652题 寻找重复的子树 C++解法
这道题有几个点,第一个就是如何比较结点,方法就是序列化输出字符串,然后是如何查找是否存在,方法hashmap;如何不重复插入,方法set。实际解决的还是有几个问题;class Solution {public: unordered_map<string,TreeNode*> hashmap; set<TreeNode*> res; string preorder(TreeNode *root) { if(root==NULL)原创 2021-02-04 21:24:41 · 347 阅读 · 0 评论 -
Leetcode第297题 二叉树的序列化与反序列化 C++ BFS解法
想了一晚上,用BFS去做,好长的代码啊class Codec {public: // Encodes a tree to a single string. string serialize(TreeNode* root) { if(root==NULL) return {}; TreeNode *pmove=root; stringstream ss;//采用字符流,使转换不太复杂 queue<Tre原创 2021-02-04 09:25:26 · 85 阅读 · 0 评论 -
Leetcode第10题 正则表达式匹配 C++动态规划解法
这道题难为了我快一天了。看了官方的解法,不得的说,他的解法既巧妙,又复杂。实际上这道题的第五个条件很重要。5、保证每次出现字符 * 时,前面都匹配到有效的字符。也就是说不可能出现p字符串第一个字符为 * 的情况。得出动态转移方程也并不难,但是这个方程里面是有几个坑的。而官方解法是采用了matches去避免。这里我们就直接上图说明。 如果p[i]=* , f[i][j]=f[i-1][j] or f[i][j-2] 。这一步大家都能理解,但是坑也就在这里。如果s=“c”,p=“a*c”。这种情原创 2021-01-19 09:59:45 · 324 阅读 · 0 评论 -
Leetcode第10题 正则表达式匹配 C++递归解法
这道题直接看的答案。但即使看答案也废了不少劲先看递归的完整代码class Solution {public: bool isMatch(string s, string p) { if (p.empty()) return s.empty(); bool first=!s.empty()&&(p[0]=='.'||s[0]==p[0]); if (p[1]=='*') return first&a原创 2021-01-18 19:11:51 · 181 阅读 · 0 评论 -
Leetcode第45题 跳跃游戏 II C++解法
先上菜鸡的解法,O(n^2)的复杂度,直接超时。(看答案说,java可以通过,日常有些怀疑要不要转java)答案的这种思路是从正向寻找的一样,其实差不多,class Solution {public: int jump(vector<int>& nums) { if(nums.size()<2) return 0; int n=nums.size()-1,count=0; int next=原创 2021-01-17 18:48:01 · 203 阅读 · 0 评论 -
Leetcode第435. 无重叠区间 C++解法
class Solution {public: int eraseOverlapIntervals(vector<vector<int> >& intervals) { int i,res=0; sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) { if(u[0]<v[0])原创 2021-01-17 14:56:56 · 253 阅读 · 0 评论 -
Leetcode第583题 两个字符串的删除操作 C++解法
刚开始对这题毫无头绪,想了几分钟,才意识到可以用求最长公共子序列去做。只要求出LCS,size1+size2-2*LCS即为结果。class Solution {public:int longestCommonSubsequence(string text1, string text2) { int dp[text2.size()+1],pre,temp,res=0;; memset(dp,0,sizeof(dp)); for(int i=1;i<=text1.size(原创 2021-01-13 19:13:47 · 137 阅读 · 0 评论 -
Leetcode第1143题 最长公共子序列C++解法
这个应该是动态规划入门题。很多讲动态规划的都是用这道题去讲。class Solution {public: int longestCommonSubsequence(string text1, string text2) { vector<int> p(text2.size()+1,0);//注意这里数组开辟大小要加一 //一开始运行总有问题,但就是没想到这个 vector<vector<int> > dp(te原创 2021-01-13 18:47:55 · 210 阅读 · 0 评论 -
Leetcode第78题 子集
笨方法去解,中间设置了好多无关变量,不然vector在尾插的时候会报错class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { set<int> s; for(int i=0;i<nums.size();i++) s.insert(nums[i]); vector<vec原创 2021-01-12 12:43:08 · 73 阅读 · 0 评论 -
Leetcode第152题乘积最大子数组
果不其然,错都跟标准错法一样,目前来说动态规划还是很吃力。就写出这个错法就废了不少劲。class Solution{public: int maxProduct(vector<int> &nums) { int result = nums[0]; int length = nums.size(); vector<int> s(length, 1); s.resize(leng原创 2021-01-12 10:42:23 · 78 阅读 · 0 评论 -
Leetcode第67题 二进制求和 C++解法
给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。照例先给出菜鸡想法,依次从末尾读入一个字符,然后转换为1、0求解,中间还多余考虑了某个字符长度较长的情况,但毫无疑问思路不够清晰class Solution{public: string addBinary(string a, string b) { int count_a = a.size(), count_b = b.size(); string r原创 2021-01-04 08:53:15 · 177 阅读 · 1 评论 -
Leetcode第66题 加一 C++解法
思路不够清晰。并不需要一位一位加,可以在循环中间返回的class Solution{public: vector<int> plusOne(vector<int> &digits) { if(digits[0]==0) { digits[digits.size()-1]=1; return digits; } bool addforward =原创 2021-01-02 22:21:37 · 198 阅读 · 0 评论 -
Leetcode第27题 移除元素 C++解法
首先可以按26题思路来(双指针)class Solution {public: int removeElement(vector<int>& nums, int val) { if (nums.empty()) return 0; int pf = 0, pl = nums.size(); for (; p0 < pl; ++pmove) { if (nums原创 2021-01-02 19:02:59 · 125 阅读 · 0 评论 -
Leetcode第七题给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
我就是个傻瓜,还想着用栈去记录。等看到运行时间,才意识到真是个傻X,一个循环就够了!class Solution {public: int reverse(int x) { stack<int> rec; long q,result=0,i=1; int p; if(x!=0) { q=x; while(q%10==0) {原创 2020-12-29 18:41:41 · 190 阅读 · 0 评论 -
Leetcode第一题两数和twoSum解法
第一种暴力解法,时间复杂度O(n2)O(n^{2})O(n2)双层循环class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { for(int i=0;i<nums.size();i++) { for(int j=i+1;j<nums.size();j++) if(nums[i]原创 2020-12-29 16:55:47 · 161 阅读 · 0 评论 -
Leetcode第88题 合并两个有序数组 C++解法
这道题可以说是,让一个新手承认自己是菜鸡有多么容易如果用一个辅助数组去做,肯定是可以做出来的,最后只要再移动到nums1中,但这肯定不是这道题的原意啊,不然和第21题有什么区别?所以我一开始想的用nums2[0]和nums1比较,这样可以把较大的移出去,保存在nums2中。如下:class Solution{public: void merge(vector<int> &nums1, int m, vector<int> &nums2, int n)原创 2021-01-05 10:51:44 · 148 阅读 · 0 评论