双指针_滑动窗口
LeetCode里的tag系列
BNDSllx
算法自媒体公众号:GTAlgotirhm,欢迎关注转发!
https://mp.weixin.qq.com/s?__biz=Mzg3NzMzNzU1MA==&mid=2247484346&idx=3&sn=7a3cf5f25cb8df7a958842369b4faca4&chksm=cf25cd1bf852440d4d68b75b023d547b568c06d830f0f0fff50b216d73fa3bd848ace6e7cc28&token=1029780947&lang=zh_CN#rd
展开
-
Leetcode 1052. 爱生气的书店老板 题解
题目链接:https://leetcode-cn.com/problems/grumpy-bookstore-owner/定义三个变量:sat表示所有的顾客数,unsat表示老板不控制自己的时候会不满意的顾客数,mx表示老板连续X分钟不生气所能减少的最大不满意顾客数。滑动窗口长度为X,左右向右遍历,每一步都用customers[i] * grumpy[i]计算出某一分钟不满意的顾客数,并取m...原创 2020-04-21 21:29:48 · 213 阅读 · 0 评论 -
Leetcode 1040. 移动石子直到连续 II 题解
题目链接:https://leetcode-cn.com/problems/moving-stones-until-consecutive-ii/可能我菜,但这是我4月份遇到的最考思维的题了第一步当然要排个序,因为需要关注的是端点值。第二步做个简单分析。石头的位置都是确定的,那么端点值也确定了,而每次操作都是要把两端的石头往中间挪,所以两端的差值会一直减小,最终会达到n(n就是一共石头的...原创 2020-04-21 16:10:15 · 655 阅读 · 0 评论 -
Leetcode 1004. 最大连续1的个数 III 题解
题目链接:https://leetcode-cn.com/problems/max-consecutive-ones-iii/与LeetCode424思路一致:Leetcode 424. 替换后的最长重复字符 题解代码如下:class Solution {public: int longestOnes(vector<int>& A, int K) { ...原创 2020-04-20 21:39:16 · 147 阅读 · 0 评论 -
Leetcode 978. 最长湍流子数组 题解
题目链接:https://leetcode-cn.com/problems/longest-turbulent-subarray/将问题划分为子问题,子问题1是子数组的最后一个元素较其前一个元素大,子问题2是子数组的最后一个元素较其前一个元素小,那么总问题就是两个子问题数组长度较大的那一个。用a数组存储子问题1,b数组存储子问题2,例如,a[i]表示前 i 个元素中最长的满足子问题1的子数组...原创 2020-04-20 20:50:19 · 98 阅读 · 0 评论 -
Leetcode 567. 字符串的排列 题解
题目链接:https://leetcode-cn.com/problems/permutation-in-string/很棒的一个idea是类似于操作系统中的生产者消费者问题(也就是互斥锁),用mp记录每个字母在s1中出现的次数。然后滑动窗口遍历s2,每遍历到一个字母,其对应的mp中的数值都减1。然后对于滑动窗口中出现次数为负值的(即s1中出现的次数比滑动窗口中出现次数要少,说明窗口大了),缩...原创 2020-04-20 10:56:01 · 97 阅读 · 0 评论 -
Leetcode 424. 替换后的最长重复字符 题解
题目链接:https://leetcode-cn.com/problems/longest-repeating-character-replacement/维护从 l 到 r 的滑动窗口,r从0开始向后遍历,cnt数组记录每个大写字母出现的次数。一旦当前窗口中(即 l 到 r 中间)出现次数最多的字母出现的次数mxcnt 加上k后小于窗口大小,说明改变k次之后还是不能使窗口中元素都相同,所以...原创 2020-04-19 22:22:31 · 241 阅读 · 0 评论 -
Leetcode 838. 推多米诺 题解
题目链接:https://leetcode-cn.com/problems/push-dominoes/O(n)遍历两趟算受力,代码如下:class Solution {public: string pushDominoes(string dominoes) { int len = dominoes.size(); int left[100005]...原创 2020-05-03 13:20:03 · 185 阅读 · 0 评论 -
Leetcode 713. 乘积小于K的子数组 题解
题目链接:https://leetcode-cn.com/problems/subarray-product-less-than-k/滑动窗口双指针,这里要求小于k的而非等于k的,所以每次调整窗口后要看看是不是要再算一次。第一次遇到了“超出输出限制”,发现我的stdout爆炸了。。。代码如下:class Solution {public: int numSubarrayProd...原创 2020-05-02 23:30:02 · 134 阅读 · 0 评论 -
Leetcode 930. 和相同的二元子数组 题解
题目链接:https://leetcode-cn.com/problems/binary-subarrays-with-sum/开心滑动窗口,特判可有可无但是对于神奇样例会快一点。记得双指针的界限要放在最前面!!!代码如下:class Solution {public: int numSubarraysWithSum(vector<int>& A, int S...原创 2020-05-02 22:07:23 · 215 阅读 · 0 评论 -
Leetcode 1234. 替换子串得到平衡字符串 题解
题目链接:https://leetcode-cn.com/problems/replace-the-substring-for-balanced-string/滑动窗口套模版,不说了,接着模仿去了代码如下:class Solution {public: int balancedString(string s) { int n = s.size(); ...原创 2020-05-02 18:54:36 · 220 阅读 · 0 评论 -
Leetcode 19. 删除链表的倒数第N个节点 题解
题目链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/一趟扫描:双指针,初始化为 l = head, r = head ->…-> next(n次),然后同时右移双指针,直到 r 到达链表最后一个元素,此时的 l 所指向的元素就是要删除的元素。但是这样不易实现,一点是当 l 指向要删除元素时,...原创 2020-05-02 12:16:42 · 85 阅读 · 0 评论 -
Leetcode 904. 水果成篮 题解
题目链接:https://leetcode-cn.com/problems/fruit-into-baskets/题意即找到最长的只包含两种元素的子串,双指针法,右指针遍历,cnt数组记录各元素出现的数量,count记录当前窗口内的元素种类数,若大于2则左指针右移。代码如下:class Solution {public: int totalFruit(vector<int...原创 2020-05-02 11:10:27 · 536 阅读 · 0 评论 -
Leetcode 524. 通过删除字母匹配到字典里最长单词 题解
题目链接:https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting/从左向右遍历d,每次判断当前字符串是不是 s 的子串(双指针法),若是则按照长度更长,长度相同字典序更小的原则更新最终结果。代码如下:bool issub(string sub, string s) { int i = ...原创 2020-04-30 21:10:23 · 86 阅读 · 0 评论 -
Leetcode 2. 两数相加 题解
题目链接:https://leetcode-cn.com/problems/add-two-numbers/代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), nex...原创 2020-04-30 10:18:01 · 77 阅读 · 0 评论 -
Leetcode 202. 快乐数 题解
题目链接:https://leetcode-cn.com/problems/happy-number/一道简单题,但是踩了十分钟的坑哈希表标记出现与否,最开始用的bool数组,结果超时。之后看题解改成了map,就AC了。记录一下自闭时刻代码如下:class Solution {public: int findsquare(int x) { int res = 0...原创 2020-04-30 09:12:33 · 140 阅读 · 0 评论 -
Leetcode 1248. 统计「优美子数组」 题解
题目链接:https://leetcode-cn.com/problems/count-number-of-nice-subarrays/前缀和记录奇数的数量。第一次想用(i, j)之间的循环遍历 + 剪枝:class Solution {public: int numberOfSubarrays(vector<int>& a, int k) { ...原创 2020-04-29 21:44:21 · 131 阅读 · 0 评论 -
Leetcode 75. 颜色分类 题解
题目链接:https://leetcode-cn.com/problems/sort-colors/一个指针标记0的右端点,一个指针标记2的左端点,一个指针遍历数组,若出现0或2就分别与两个标记端点的指针位置互换。代码如下:class Solution {public: void sortColors(vector<int>& s) { int...原创 2020-04-29 17:50:11 · 80 阅读 · 0 评论 -
Leetcode 80. 删除排序数组中的重复项 II 题解
题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/与原题不同,这道题每个元素可出现1-2次,所以要用一个额外的count记录当前元素出现次数。代码如下:class Solution {public: int removeDuplicates(vector<int>&...原创 2020-04-29 14:39:04 · 90 阅读 · 0 评论 -
Leetcode 86. 分隔链表 题解
题目链接:https://leetcode-cn.com/problems/partition-list/最终的链表分为两部分:小于 x 的前一部分和大于等于 x 的后一部分,所以最开始用两个空指针作为两个新链表的头部,存储满足条件的元素,最后连在一起即可。代码如下:/** * Definition for singly-linked list. * struct ListNode {...原创 2020-04-29 12:24:10 · 132 阅读 · 0 评论 -
Leetcode 11. 盛最多水的容器 题解
题目链接:https://leetcode-cn.com/problems/container-with-most-water/双指针法,初始状态下左指针在最左,右指针在最右,此时宽度最大。缩小宽度时,我们选择较短的一边进行移动,因为面积取决于双端点中较短的那个。代码如下:class Solution {public: int maxArea(vector<int>...原创 2020-04-29 09:36:03 · 95 阅读 · 0 评论 -
Leetcode 763. 划分字母区间 题解
题目链接:https://leetcode-cn.com/problems/partition-labels/贪心算法,维护cnt数组记录每个字母最后一次出现的位置,然后双指针遍历,一个指针遍历当前字母,另一个指针指向当前字母最后出现的位置,如果两指针相遇,说明这个part结束了。然后更新两指针新一轮的起始位置,直到遍历完字符串。代码如下:class Solution {public:...原创 2020-04-29 08:32:00 · 138 阅读 · 0 评论 -
Leetcode 28. 实现 strStr() 题解
题目链接:https://leetcode-cn.com/problems/implement-strstr/最简单的方法是遍历搜索,复杂度为O(NL),其中N和L分别为两个字符串的长度。这里说一下“Rabin Karp - 常数复杂度”算法,只需要O(N)的复杂度:字符串中均为小写字母,故经过 needle[i] - 'a’的处理可将其化为 0 - 25 范围内的数值,可以用“哈希码”表...原创 2020-04-28 18:07:20 · 151 阅读 · 0 评论 -
Leetcode 457. 环形数组循环 题解
题目链接:https://leetcode-cn.com/problems/circular-array-loop/快慢指针法,由于题目要求循环内必须为同向,所以限制条件要使每一步的下标及其对应元素同符号。为简化时间复杂度,每遍历完一个点及其可到达的点后,若没有发现循环,则将其及其可达点都标记为0.代码如下:class Solution {public: bool circu...原创 2020-04-28 09:59:29 · 406 阅读 · 0 评论 -
Leetcode 287. 寻找重复数 题解
题目链接:https://leetcode-cn.com/problems/find-the-duplicate-number/不能更改原数组,所以排序是不ok的。快慢指针法,由于数组元素下标范围为 0-n,而且值也在 1-n 之间,所以我们不妨将其视为一个链表,某个数组元素对应的值表示其指向的下一个节点的下标。由于某个元素会出现多次,所以至少有两个结点的指针会指向同一个结点(即这个重复元素...原创 2020-04-27 17:19:23 · 135 阅读 · 0 评论 -
Leetcode 283. 移动零 题解
题目链接:https://leetcode-cn.com/problems/move-zeroes/快慢指针,快指针找到一个非零元素,就换到当前慢指针指向位置,慢指针右移,快指针右移;否则只有快指针右移。最后将慢指针右侧所有元素都置0代码如下:class Solution {public: void moveZeroes(vector<int>& nums) ...原创 2020-04-26 20:55:50 · 110 阅读 · 0 评论 -
Leetcode 995. K 连续位的最小翻转次数 题解
题目链接:https://leetcode-cn.com/problems/minimum-number-of-k-consecutive-bit-flips/第一道LeetCode困难题 AC 嘿嘿嘿由于目标是把所有的0都变成1,所以从左向右遍历,只要看到0就翻转一次,维护长度为K的滑动窗口,当窗口到达数组最右端后,如果还存在 0,说明不可能全部翻转,返回 -1但是滑动窗口右移的过程...原创 2020-04-26 13:21:54 · 192 阅读 · 0 评论 -
Leetcode 992. K 个不同整数的子数组 题解
题目链接:https://leetcode-cn.com/problems/subarrays-with-k-different-integers/滑动窗口,从左向右遍历(1)读取一个元素,维护count数组记录出现的次数,如果是第一次出现,count++(2)如果当前count > K,则左指针右移,直到 count = K(3)在当前 count == K的前提下,用 t ...原创 2020-04-25 23:11:20 · 350 阅读 · 0 评论 -
Leetcode 239. 滑动窗口最大值 题解
题目链接:https://leetcode-cn.com/problems/sliding-window-maximum/新学的数据结构:双端队列deque() 相较于一般的队列queue(),双端队列能够在O(1)的复杂度下对头、尾进行插入、删除等在滑动窗口滑动过程中,维护一个deque记录当前的最大值,更新时:(1)判断当前deque尾部元素是否比当前遍历到的元素小,如果是,则一直p...原创 2020-04-23 11:35:18 · 113 阅读 · 0 评论 -
Leetcode 1208. 尽可能使字符串相等 题解
题目链接:https://leetcode-cn.com/problems/get-equal-substrings-within-budget/滑动窗口自左向右遍历,每次sum加上右指针对应的开销,一旦sum > maxCost,就将左指针右移直到满足条件。每次都更新最大值。代码如下:class Solution {public: int equalSubstring(s...原创 2020-04-22 18:13:31 · 195 阅读 · 0 评论 -
Leetcode 3. 无重复字符的最长子串 题解
题目链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/用map类型的cnt记录每个字符在当前窗口内出现的次数,一旦滑动窗口右侧读到的字符出现过,那么更新最大无重复长度,缩小窗口直到当前重复的字符只出现一次。要注意的一点是,可能存在一条龙读完没有更新的情况,所以窗口走完之后要再更...原创 2020-04-21 22:07:26 · 103 阅读 · 0 评论