双指针
csu_xiji
这个作者很懒,什么都没留下…
展开
-
力扣 881. 救生艇 贪心 双指针
https://leetcode-cn.com/problems/boats-to-save-people/思路:贪心,我们从体重低的开始考虑,因为一艘船最多可以坐两个人,因此体重低的人应该尽可能的带一个体重最大的人,如果不满足重量限制,那么只能让体重最大的人单独一艘船了。class Solution {public: int numRescueBoats(vector<int>& people, int limit) { sort(people.begi原创 2021-08-27 01:21:29 · 147 阅读 · 0 评论 -
力扣 413. 等差数列划分 数学 双指针
https://leetcode-cn.com/problems/arithmetic-slices/思路:显然可以通过双指针找到等差数列的区间[l,r][l,r][l,r],那么依据题目的定义,分别统计长度为3、4、5...3、4、5...3、4、5...的等差数列的个数即可,即:(r−l−2)+(r−l−3)+...+1(r-l-2)+(r-l-3)+...+1(r−l−2)+(r−l−3)+...+1。这不就是等差数列的和嘛,可以O(1)O(1)O(1)求得,因此算法的总复杂度为O(n)O(n)O原创 2021-08-11 00:30:00 · 122 阅读 · 0 评论 -
力扣 611. 有效三角形的个数 排序 双指针
https://leetcode-cn.com/problems/valid-triangle-number/思路一:排序+二分,枚举较小的两条边i、ji、ji、j,然后通过二分找到最大的满足a[i]+a[j]>a[k]a[i]+a[j]>a[k]a[i]+a[j]>a[k]的kkk,那么它们对答案的贡献为k−jk-jk−j,代码略。思路二:当iii确定的时候,显然jjj越大,kkk也越大,因此可以利用双指针来做,每次把j+1j+1j+1,然后找到满足题意的最大的kkk统计贡献即可。原创 2021-08-05 00:43:34 · 206 阅读 · 0 评论 -
力扣 1838. 最高频元素的频数 滑动窗口
https://leetcode-cn.com/problems/frequency-of-the-most-frequent-element/思路:首先不难想到对原数组排序……那么对于每个起始点lll,我们可以计算出满足条件的最大的rrr,更新ans=max(ans,r−l+1)ans=max(ans,r-l+1)ans=max(ans,r−l+1)。但是这样复杂度是O(n2)O(n^2)O(n2)的,还是会超时。进一步思考,不难发现如果区间[l,r][l,r][l,r]不满足题意,那么对于任意l′&原创 2021-07-19 23:12:39 · 129 阅读 · 0 评论 -
力扣 633. 平方数之和 双指针/暴力
https://leetcode-cn.com/problems/sum-of-square-numbers/思路:暴力枚举或者双指针都行。class Solution {public: bool judgeSquareSum(int c) { unsigned int l=0,r=ceil(sqrt(c)); while(l<=r) { unsigned int tmp=l*l+r*r;原创 2021-04-28 00:53:42 · 79 阅读 · 0 评论 -
力扣 26. 删除有序数组中的重复项 双指针
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/思路:定义快慢指针,初始slow=fast=0slow=fast=0slow=fast=0,如果nums[fast]=nums[slow]nums[fast]=nums[slow]nums[fast]=nums[slow],那么递增fastfastfast,不然就令nums[slow+1]=nums[fast]nums[slow+1]=nums[fast]nums[s原创 2021-04-18 00:58:46 · 127 阅读 · 0 评论 -
力扣 80. 删除有序数组中的重复项 II 双指针
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/思路:双指针(快慢指针),考虑到数组的前2个数一定可以保留,不妨令l=r=2l=r=2l=r=2,若nums[l−2]=nums[r]nums[l-2]=nums[r]nums[l−2]=nums[r],由数组的单调性可知,nums[l−2]nums[l-2]nums[l−2]已经出现了三次,那么就让快指针一直往后直到找到一个不等于nums[l−2]nums[l原创 2021-04-06 12:30:26 · 98 阅读 · 0 评论 -
力扣 395. 至少有 K 个重复字符的最长子串 分治 滑动窗口
https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters/思路:分治法,考虑区间[l,r][l,r][l,r],统计其内每个字符的出现次数,然后看是否有字符不满足题意,若满足说明当前区间合法,返回有效长度r−l+1r-l+1r−l+1;若不满足则任何含有该字符的区间(子字符串)都不满足题意,所以我们可以以这个字符为间断,把[l,r][l,r][l,r]分为几个部分分治计算。class原创 2021-02-28 01:58:28 · 206 阅读 · 0 评论 -
力扣 1052. 爱生气的书店老板 思维 枚举 滑动窗口
https://leetcode-cn.com/problems/grumpy-bookstore-owner/思路:硬要说的话感觉我这个解法怪怪的,和平时见到的滑动窗口不太一样,因为窗口大小是固定不变的。看完题目,很容易想到使用一个长度固定为XXX的窗口,然后枚举左边界即可,那么怎么保证整体复杂度是O(n)O(n)O(n)的呢?利用前缀和的思想,在初始化时以当前窗口的左右边界(初始时窗口为[0,X)[0,X)[0,X))为限,可以计算出一个前缀和和后缀和,那么在移动窗口的时候维护这两个和值即可。cl原创 2021-02-23 19:45:32 · 153 阅读 · 0 评论 -
力扣 697. 数组的度 哈希 双指针
https://leetcode-cn.com/problems/degree-of-an-array/思路:首先遍历一遍统计数组的度,之后维护滑动窗口,保证窗口内的度等于最大值即可。class Solution {public: int findShortestSubArray(vector<int>& nums) { vector<int> cnt(50000); int n=nums.size(),MAX=0;原创 2021-02-20 15:26:26 · 88 阅读 · 0 评论 -
力扣 1004. 最大连续1的个数 III 滑动窗口
https://leetcode-cn.com/problems/max-consecutive-ones-iii/思路:滑动窗口模板题吧……由于求的是最长连续子数组的长度,那么在维护窗口时没必要将其缩小(因为我们要的是最优解),这样就不需要额外操作来记录最大值了。class Solution {public: int longestOnes(vector<int>& A, int K) { int l=0,r=0,n=A.size();原创 2021-02-19 14:29:08 · 203 阅读 · 0 评论 -
力扣 567. 字符串的排列 滑动窗口
https://leetcode-cn.com/problems/permutation-in-string/思路:如果s2s_2s2包含s1s_1s1的排列,那么必定存在一个s2s_2s2的字串sss,sss中任意字符的出现次数一定等于s1s_1s1中对应字符的出现次数。转换到这一步就比较好搞了,当然暴力做还是会超时的,正解是滑动窗口。首先用cntcntcnt数组记录s1s_1s1中每个字符的出现次数,然后令l=r=0l=r=0l=r=0(窗口的边界),我们不断移动右边界(入窗),当某个时候原创 2020-09-07 13:59:57 · 156 阅读 · 0 评论 -
力扣 992. K 个不同整数的子数组 思维 滑动窗口
https://leetcode-cn.com/problems/subarrays-with-k-different-integers/思路:这个思维转换真的是妙啊。如果直接用滑动窗口来做的话,会发现结果对不上,会漏掉一些区间。那么我们可以考虑枚举子数组的长度,但是这样一来复杂度是O(n2)O(n^2)O(n2),会超时。一般来说,使用滑动窗口的问题会有这种特性:最大、最多、最长。但是这道题是恰好,我们考虑把问题转换一下,假设solve(k)solve(k)solve(k)可以求出不同整数的个数最多为原创 2021-02-09 13:04:13 · 164 阅读 · 0 评论 -
力扣 978. 最长湍流子数组 滑动窗口 dp
https://leetcode-cn.com/problems/longest-turbulent-subarray/思路一:滑动窗口。先只考虑第一种情况,我们可以维护一个满足题意的窗口[l,r)[l,r)[l,r),每次检测arr[r−1]、arr[r]arr[r-1]、arr[r]arr[r−1]、arr[r]是否满足定义,若满足则令r=r+1r=r+1r=r+1,否则说明区间[l,r][l,r][l,r]不满足题意了,那么可以令l=r,r=r+1l=r,r=r+1l=r,r=r+1。第二种情况类原创 2021-02-08 21:04:58 · 109 阅读 · 0 评论 -
力扣 643. 子数组最大平均数 I 滑动窗口
https://leetcode-cn.com/problems/maximum-average-subarray-i/思路:简单不谈,维护一个大小为kkk的窗口滑就完事了。class Solution {public: double findMaxAverage(vector<int>& nums, int k) { int sum=0; for(int i=0;i<k;i++) sum+=nums[i];原创 2021-02-04 15:44:58 · 163 阅读 · 0 评论 -
力扣 1208. 尽可能使字符串相等 二分 滑动窗口
https://leetcode-cn.com/problems/get-equal-substrings-within-budget/思路一:考虑枚举转换的字符串的长度,那么在O(s.length)O(s.length)O(s.length)内即可计算出在costcostcost限制下是否有解,那么可以从111开始枚举直到不满足题意为止,但是这样做会超时。不难发现转换的字符串长度和消耗的代价是有单调性的(这里仅考虑最优解),所以可以上二分,那么复杂度大概为O(nlgn)O(nlgn)O(nlgn),可原创 2021-02-05 15:43:31 · 148 阅读 · 0 评论 -
力扣 424. 替换后的最长重复字符 双指针
https://leetcode-cn.com/problems/longest-repeating-character-replacement/思路一:由于只有26个候选字母,所以答案一定会在它们之间产生,那么我记录每个字母出现的所有位置,然后枚举26个字母,对于每次枚举而言,其实就是一个双指针问题。这样时间复杂度还是O(strlen)O(strlen)O(strlen),但是空间复杂度略高。class Solution {public: int characterReplacement(原创 2021-02-02 23:53:22 · 112 阅读 · 0 评论 -
力扣 392. 判断子序列 dp/双指针
https://leetcode-cn.com/problems/is-subsequence/思路:有一个显然正确的贪心:对于任意一个字符iii,假设可选的匹配位置有pos1、pos2pos_1、pos_2pos1、pos2,且pos1<pos2pos_1<pos_2pos1<pos2,那么应该选择pos1pos_1pos1而不是pos2pos_2pos2。双指针的做法就不说了,说一下后续挑战怎么搞。第一个思路我们用vec[i][j]vec[i][j]vec[i][j]记原创 2020-10-08 18:54:45 · 226 阅读 · 0 评论