LeetCode
文章平均质量分 55
风zx
这个作者很懒,什么都没留下…
展开
-
LeetCode 84:柱状图中最大的矩形(困难)
LeetCode 84:柱状图中最大的矩形解答这两道单调栈的题目需要好好反思一下,为什么思路大体正确但是都没有做出来代码一思路一模仿接雨水中双指针的方法,接雨水中是要找到 val 左右两侧中最高的柱子,取min得到水平面高度本题中是要找到val 往左往右拓展, 尽可能往左/往右 大于等于 val的柱子索引,这个就是计算宽度,高度就是val好像都是根据val, 找到宽的制约因素。这个思路自己想出来了,但是没有写代码,因为最坏情况复杂度为O(n^2),但下面的代码没超时,class原创 2022-02-01 11:36:47 · 1214 阅读 · 0 评论 -
LeetCode 239: 滑动窗口最大值(困难)
LeetCode 239: 滑动窗口最大值解答代码一:大根堆最好的解法是单调队列,但是一开始想的是大根堆问题在于如何将滑动窗口移出的元素从大根堆中删除,大根堆只能pop,没法移除特定的元素。这里就陷入了困境。解决方法是判断top是否在滑动窗口内,因此要将下标放入大根堆中,判断top->second是否大于i-k滑动窗口的大小永远小于等于k,但是这里大根堆的大小最坏情况是O(n),自己没有想到上面的转换,很大程度上我就是既想删除移出的元素,又想保持大根堆元素小于等于k,陷入了困境。现在原创 2022-01-31 17:07:18 · 656 阅读 · 0 评论 -
LeetCode 42: 接雨水(困难)
LeetCode 42: 接雨水解答这个题需要好好分析一下,自己的思路离单调栈的标准答案就一步之遥了,就是没想出来,最近有点颓md,代码一:单调栈主要分析一下为什么自己的思路大体方向是正确的,但就是差最后一步。首先,分析出来只有凹槽结构才能接雨水,单调栈处理每个凹槽结构,这个没问题。接下来,应该按照行计算,我前面按照行的思路思考,但是后面却按照列的思路累加凹槽,想着对每个凹槽确定左右界限,列累加,杂糅了单调栈和动规,越写越乱。没有想到到底是按行计算还是按列计算,导致后面越写越乱。 根本原因还原创 2022-01-30 20:50:51 · 1213 阅读 · 0 评论 -
LeetCode 503: 下一个更大元素 II
LeetCode 503: 下一个更大元素 II解答单调栈,但中间有一些小细节需要注意代码一这里需要特别注意的是单调栈中存的是值还是下标索引,如果存值的话(有时候写起来会简单一些),需要搭配map的(val, idx)映射,适合用于数组中没有重复值的情况;如果存下标索引的话,感觉这个更通用,但是有的题存值更方便一些这个题目因为数组中有重复值,数组中重复值的nxtGreaterElem很可能不同,不能用存值的方法。还有就是拿一个比较典型的例子来初步验证想法,比如一开始想的是两个数组拼起来+map原创 2022-01-30 13:32:25 · 874 阅读 · 0 评论 -
LeetCode 496:下一个更大元素 I
LeetCode 496:下一个更大元素 I解答单调栈+哈希,这里记录一下两种顺序相反的实现方式:顺序遍历和逆序遍历数组都可以,但是逻辑变化代码一记录nums1中(val, idx)的映射从左到右遍历nums2,now=nums2[i]在now > st.top()部分中,now是出栈元素的nextGreater, 从当前值now 确定以当前值now为nextGreater的元素 (根据nextGreater确定元素), 出栈元素找到了nextGreater,查表这里的单调栈是单调递原创 2022-01-25 17:56:05 · 222 阅读 · 0 评论 -
LeetCode 面试题 02.07. 链表相交
LeetCode 面试题 02.07. 链表相交解答不难,这里着重纪录一下第二种方法,比较巧代码一王道数据结构上有类似题目,双指针同步走class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { int lena=0, lenb=0; ListNode *pa=headA, *pb=headB; while(pa原创 2022-01-24 19:19:18 · 569 阅读 · 0 评论 -
LeetCode 19:删除链表的倒数第N个结点
LeetCode 19:删除链表的倒数第N个结点解答双指针,不难,这里记录一下添加虚拟头节点,写代码的时候以为加一个虚拟头节点有点烦,其实代码很简单,否则需要if else判断代码一没有使用虚拟头节点,如果删除第一个节点(倒数第N个),需要判断prev是否为空class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { if(head->next == nullptr &a原创 2022-01-24 10:28:49 · 54 阅读 · 0 评论 -
LeetCode 151: 翻转字符串里的单词
LeetCode 151: 翻转字符串里的单词解答模拟题,先规范空格,在两次反转两次反转的思想在王道数据结构上有规范空格的时候先考虑好各种情况,再一边调试一边修改细节,这道题主要练了这部分代码一class Solution {public: void Swap(string &s, int left, int right){ while(left < right) swap(s[left++], s[right--]);原创 2022-01-24 01:08:12 · 167 阅读 · 0 评论 -
LeetCode 202: 快乐数
LeetCode 202: 快乐数解答这个题目的经验是纠正自己的习惯题目不难,自己犯的错误是一上手就开始写代码,应该先举几个例子,分析一下有几种可能(比如一开始在中间开始循环就没考虑)通过分析可知情况三不会出现(m位数字的快乐数有上限)代码一:哈希当发现可能有循环时,第一反应是set记录下来每次的数,但是不知道要循环几次,class Solution {public: bool isHappy(int n) { unordered_set<int> s原创 2022-01-23 17:57:31 · 50 阅读 · 0 评论 -
LeetCode 349: 两个数组的交集
LeetCode 349: 两个数组的交集解答简单,关键有几个地方需要学习和记录一下传入参数是容器,要求第一个参数是小容器,第二个参数是大容器注意getInterserction函数中,要求set1是小集合,set2是大集合,如何对传入的set1和set2进行判断和交换(如果不符合)呢?很巧的方法是重新传参class Solution {public: vector<int> intersection(vector<int>& nums1, vect原创 2022-01-23 11:02:49 · 623 阅读 · 0 评论 -
LeetCode 59:螺旋矩阵
LeetCode 59:螺旋矩阵解答没什么思维难度,关键是代码的实现方式和中间的细节代码一使用direct表示填充方向,由此判断坐标加减有点贪心的意思,一直往当前方向填充,碰到边界先回退,在redirect中间三段代码有点重复,不够优雅(一开始的想法是基于当前位置来尝试下一个位置,有点像走迷宫)// my solutionclass Solution {public: void show(vector<vector<int> > v){原创 2022-01-22 11:45:14 · 169 阅读 · 0 评论 -
LeetCode 76:最小覆盖子串(困难)
LeetCode 76:最小覆盖子串(困难)解答基本的滑动窗口应该不难想到,关键是如何判断s的滑动窗口中包含t的所有字母。代码一对s的滑动窗口和字符串t统计字母频率,记录在scnt和tcnt中,对于每个位置i的字母, scnt[i] ≥\ge≥ tcnt[i], 否则s的滑动窗口不能完全包含字符串t。由此得到函数judgeclass Solution {public: bool judge(int* scnt, int* tcnt, string t){ for(i原创 2022-01-22 01:50:14 · 369 阅读 · 0 评论 -
LeetCode 904: 水果成篮(中等)
LeetCode 904: 水果成篮(中等)解法代码一:按块扫描+滑动窗口手动模拟一下感觉不难,自己写代码感觉总有很多琐碎的细节一开始按块扫描为了思路简单,但是按照代码二也不难class Solution {public: int totalFruit(vector<int>& fruits) { if(fruits.size() == 0) return 0; int bucket[2] = {0,0}; int原创 2022-01-21 21:03:07 · 157 阅读 · 0 评论 -
LeetCode 283:移动零
LeetCode 283:移动零解法:双指针思路一:覆盖,需要对数组中的每个元素操作一次(前面非零数复制,后面补零)class Solution {public: void moveZeroes(vector<int>& nums) { int idx=0; for(int i=0; i<nums.size(); i++){ if(nums[i]!=0) nums[idx++] = nums[i];原创 2022-01-21 17:46:34 · 321 阅读 · 0 评论 -
LeetCode 34:在排序数组中查找元素的第一个和最后一个位置
LeetCode 34:在排序数组中查找元素的第一个和最后一个位置二分模板// 在给定的一组升序数组中,找到第一个>=x的位置int find_first(vector<int> v, int x){ int left=0, right=v.size()-1, mid, ans=-1; while(left <= right){ mid = (right-left)/2+left; if(v[mid] >= x){原创 2022-01-21 17:40:18 · 347 阅读 · 0 评论 -
LeetCode 209:长度最小的子数组
LeetCode 209:长度最小的子数组解法解法一:滑动窗口想法不难,主要比较一下自己的实现方法和标准的实现方法之间的区别// mineclass Solution {public: int minSubArrayLen(int target, vector<int>& nums) { int minlen=1e5+5, left=0, right=-1, sum=0; // 如果一开始设置right=0, sum=nums[0]原创 2022-01-21 10:17:12 · 152 阅读 · 0 评论 -
LeetCode 27:移除元素
LeetCode 27:移除元素解答:双指针解法一:快慢指针在最坏情况下(输入数组中没有元素等于val),左右指针各遍历了数组一次。但不会改变相对位置。class Solution {public: int removeElement(vector<int>& nums, int val) { int n = nums.size(); int left = 0; for (int right = 0; right &l原创 2022-01-21 00:36:36 · 227 阅读 · 0 评论 -
LeetCode:1 两数之和
LeetCode:1 两数之和解法解法一: 二重循环暴力解法二: 两遍哈希表核心思想:a+b=target, 根据target-a查找b, 一遍for循环STL mapcount函数: size_type count (const key_type& k) const; // 返回被查找元素的个数,1或0find函数: iterator find (const key_type& k); // 返回被查找元素的位置(迭代器), 没有则返回map.end()原创 2022-01-20 22:36:32 · 424 阅读 · 0 评论