1004. 最大连续1的个数 III
目录
- 一、题目
- 二、思路
- 2.1 解题思路
- 2.2 代码尝试
- 2.3 疑难问题
- 三、解法
- 四、收获
- 4.1 心得
- 4.2 举一反三
一、题目
二、思路
2.1 解题思路
2.2 代码尝试
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int m=k;
//每个窗口遇到0的时候先使用K,到k用完了之后再统计长度
int cur=0;//记录当前长度
int count=0;//记录最大长度
int l=0;//有一个左边界用于记录滑动窗口的左边界
for(int i=0;i<nums.size();i++){
//判断是否为1
if(nums[i]==1){
cur++;
count=max(cur,count);
}else{
//分两种情况,m可用和m不可用
if(m>0){
//m可用就继续延伸
cur++;
m--;
count=max(cur,count);
}else{
//m不可用就将左边界定位到i-k的位置,并释放一个m
m++;
cur=1;
}
}
}
return count;
}
};
感觉有一个大致的思路,但是还差了一点,不过现在写代码有点思路了,不像之前写不出来就是一整段写不出来。
2.3 疑难问题
三、解法
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int n = nums.size();
int left = 0, lsum = 0, rsum = 0;
int ans = 0;
for (int right = 0; right < n; ++right) {
rsum += 1 - nums[right];
while (lsum < rsum - k) {
lsum += 1 - nums[left];
++left;
}
ans = max(ans, right - left + 1);
}
return ans;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/max-consecutive-ones-iii/solutions/608931/zui-da-lian-xu-1de-ge-shu-iii-by-leetcod-hw12/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
四、收获
4.1 心得
官方解决的滑动窗口太优雅了
4.2 举一反三
滑动窗口的模板就是内外循环,两个指针,内循环一个不满足的窗口条件