1004 最大连续1的个数 III
这道题要求将原数组中的0翻转成1,求出最大元素全是1的子数组长度,看这道题第一感觉还要将里面的0变成1,感觉这道题解决起来很麻烦,但是我们可以转变思路,找出其最大子数组,使得子数组里面0元素的个数不超过 k,然后求其子数组长度。
算法步骤:
1. 利用同向指针 left 和 right 指向数组的第一个下标位置;
2. 让 right 指针往数组后面走,使用记录 0 个数的变量 count ;
当count > k 时,说明 [left,right)区间内 0 的个数已经大于 k ;
然后让 left 往右走 , 减小 0 的个数即--count,当 count 不大于 k 时结束,
3. 更新子数组长度的结果。
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int left =0, right = 0 ;
int maxSum = 0; //记录最长子数组的长度
int count = 0; // 记录 0 的个数
while(right < nums.size())
{
if(nums[right] == 0)
{
++count;
}
while(count > k)
{
if(nums[left++] ==0)
{
--count;
}
}
//更新结果
maxSum = max(maxSum,right-left+1);
++right;
}
return maxSum;
}
};