滑动窗口
消灭猕猴桃
保持热爱,奔赴山海
展开
-
[leetCode]395. 至少有 K 个重复字符的最长子串
题目https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters/滑动窗口题目要求最长子串,最长子串中字符的种类数在[1,26]的左闭右闭的范围内。遍历所有种类数,在符合每种种类数中的字符串中寻找最长子串。还需要维护窗口内每个字符的出现频次,以及窗口内频次小于k的字符数量less,如果less>0这当前字符串及其子串肯定不是最长的字符子串。class Solution {原创 2021-02-27 13:35:59 · 208 阅读 · 0 评论 -
[leetCode]995. K 连续位的最小翻转次数
题目https://leetcode-cn.com/problems/minimum-number-of-k-consecutive-bit-flips/差分数组最简单的贪心思路就是从左往右遍历数组,如果当前位置A[i]为0 则需要翻转[i, i + K - 1]之间的元素,不断执行这个操作加入最终数组全为1则执行的翻转次数就是最少的。由上面的思路可以知道,如果当前位置A[i]=0则需要翻转,那么如果我们知道了当前位置的翻转次数是偶数并且A[i]为0的话我们就需要翻转一次数组,因此可以利用差分原创 2021-02-18 11:12:57 · 130 阅读 · 0 评论 -
[leetCode]485. 最大连续1的个数
题目https://leetcode-cn.com/problems/max-consecutive-ones/滑动窗口class Solution { public int findMaxConsecutiveOnes(int[] nums) { int len = nums.length; int left = 0; int right = 0; int maxOneCnt = 0; while (rig原创 2021-02-15 08:33:47 · 134 阅读 · 0 评论 -
[leetCode]239. 滑动窗口最大值
题目https://leetcode-cn.com/problems/sliding-window-maximum/优先队列使用一个优先队列(大顶堆)维护每个窗口的最大最大值。使用两个指针right, left维护窗口的移动,当right - left + 1 == k 时说明窗口移动到了下一个位置,队列中新增一个元素,需要考虑堆顶元素是否还在窗口中,如果不在窗口中则需要一直弹出堆顶元素,最后在窗口中的堆顶元素即为当前窗口的最大值。class Solution { public int原创 2021-01-02 12:58:26 · 149 阅读 · 1 评论 -
[leetCode]567. 字符串的排列
题目https://leetcode-cn.com/problems/permutation-in-string/滑动窗口窗口的大小为字符串1的长度,由于要找到字符串2中是否包含字符串1的排列所以只要字符串2的窗口中的字符出现频次等于字符串1中的字符出现频次就说明找到了一个排列,每次移动窗口只需要维护新加入窗口元素的频次和离开窗口元素的频次。窗口每移动一次进行一次匹配class Solution { public boolean checkInclusion(String s1, St原创 2020-12-22 18:23:44 · 131 阅读 · 0 评论 -
[leetCode]992. K 个不同整数的子数组
题目https://leetcode-cn.com/problems/subarrays-with-k-different-integers/滑动窗口此题的问法和很多滑动窗口的题目问法类似但还是有些不同,题目中问的是恰好有K个不同整数的区间数量,而一般滑动窗口问的问题是最多。。。。可以将问题转化为最多有K个整数的区间数量,这样的区间数量就是right - left,那么恰好有K个不同整数的区间数量就等于最多有K个整数的区间数量减去最多有K-1个整数的区间数量。class Solution {原创 2021-02-09 09:08:07 · 122 阅读 · 0 评论 -
[leetCode]978. 最长湍流子数组
题目https://leetcode-cn.com/problems/longest-turbulent-subarray/动态规化class Solution { public int maxTurbulenceSize(int[] arr) { int n = arr.length; if (n < 2) return n; int[] increased = new int[n]; int原创 2021-02-08 09:16:56 · 188 阅读 · 0 评论 -
[leetCode]1423. 可获得的最大点数
题目https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards/滑动窗空思路:要从两边取k个元素使之和最大,也就是取连续n-k个元素使之和最小,因此可以使用滑动窗口class Solution { public int maxScore(int[] cardPoints, int k) { int n = cardPoints.length; int windowS原创 2021-02-06 09:07:57 · 109 阅读 · 0 评论 -
[LeetCode]3.无重复字符的最长子串
自己的解法将字符串转化为字符数组,从首字符向后扫描字串,找到不重复的最长字串class Solution { public int lengthOfLongestSubstring(String s) { char[] chars = s.toCharArray(); HashSet<Character> hs = new HashSet()...原创 2019-11-20 13:06:24 · 104 阅读 · 0 评论 -
[leetCode]1208. 尽可能使字符串相等
题目https://leetcode-cn.com/problems/get-equal-substrings-within-budget/思路字符串s与t每一个对应字符的开销为∣s[i]−s[t]∣| s[i] - s[t] |∣s[i]−s[t]∣因此可以构建一个diff数组其中diff[i]=∣s[i]−s[t]∣diff[i] = | s[i]-s[t] |diff[i]=∣s[i]−s[t]∣,这样问题就转化成了在diff数组中求区间和不超过maxCost的最长区间长度。滑动窗口原创 2021-02-05 12:28:22 · 194 阅读 · 0 评论 -
[leetCode]1248. 统计「优美子数组」
题目https://leetcode-cn.com/problems/count-number-of-nice-subarrays/滑动窗口使用双指针维护一个逻辑意义上的窗口区间为[left, right)。随着右指针的移动统计窗口内的奇数个数,如果奇数个数为k了,这时候再统计与当前窗口相关的子串的个数,可以这样统计:计算算窗口内最右侧奇数右边有几个偶数,用rightEvenCnt表示,也就是说有几种选择结尾的方式,由于可以什么偶数都不选所以一共有 rightEvenCnt + 1 种结尾方原创 2021-02-04 21:32:46 · 164 阅读 · 0 评论 -
[leetCode]643. 子数组最大平均数 I
题目https://leetcode-cn.com/problems/maximum-average-subarray-i/滑动窗口使用前缀和来快速计算一个区间内的和,从而可以计算平均数。class Solution { public double findMaxAverage(int[] nums, int k) { int n = nums.length; int[] sum = new int[n + 1]; for (int i原创 2021-02-04 08:10:16 · 171 阅读 · 0 评论 -
[leetCode]424. 替换后的最长重复字符
题目https://leetcode-cn.com/problems/longest-repeating-character-replacement/滑动窗扣使用双指针维护一个逻辑上的窗口,当 窗口的长度小于等于 窗口内出现最多的字符的数量 + k 时,窗口内的字符替换小于等于k次后能变为同样的字符。因此一开始不断移动右指针,维护窗口内最多的字符数量,如果不能满足right - left > maxCount + k说明替换k次无法使窗口内字符全部一样,这时候就需要移动左指针,下面代码使用原创 2021-02-02 11:42:26 · 110 阅读 · 0 评论 -
[leetCode]1438. 绝对差不超过限制的最长连续子数组
题目https://leetcode-cn.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/滑动窗口使用双指针维护窗口移动,使用TreeMap或者双端队列来维护窗口中得最大值和最小值TreeMapclass Solution { public int longestSubarray(int[] nums, int limit) { int n原创 2021-02-01 11:27:52 · 178 阅读 · 0 评论 -
[leetCode]1004. 最大连续1的个数 III
题目https://leetcode-cn.com/problems/max-consecutive-ones-iii/滑动窗口解法与第424题相同class Solution { public int longestOnes(int[] A, int K) { int n = A.length; int maxCount = 0; int left = 0, right = 0; while (right < n)原创 2021-02-03 14:06:23 · 116 阅读 · 0 评论 -
[leetCode] 295. 数据流的中位数
题目https://leetcode-cn.com/problems/find-median-from-data-stream/双优先队列写法一class MedianFinder { private PriorityQueue<Integer> small; private PriorityQueue<Integer> large; private int smallSize, largeSize; /** initialize y原创 2021-02-03 13:18:09 · 82 阅读 · 0 评论 -
[leetCode]480. 滑动窗口中位数
题目https://leetcode-cn.com/problems/sliding-window-median/双优先队列加延迟删除由于要得到一个窗口内的中位数,可以使用两个优先队列small(大顶堆)、large(小顶堆),一个维护窗口内元数排序后较小的一半,一个维护较大的一半,如果元素个数为奇数那个中位数为small的堆顶元素,如果元素个数为偶数那么中位数就是small与large的堆顶元素除以2,此题的难点在于怎样保持两个堆的元素数量各占一半。一开始将元素加入small中,如果smal原创 2021-02-03 13:05:45 · 150 阅读 · 0 评论