【剑斩OFFER】算法的暴力美学——最大连续1的个数 III
一、题目描述
二、算法原理
1.先定义三个变量right 、left、zero,其中 right 和 left 都指向第一个数,而 zero 记录 right 在右移时 0 的个数。
2.当 zero > 0 时,此时的 left 到 right 之间的长度是不合法的。
3、那么一般发暴力写法是 left 右移意味,然后 right 也回去指向和 left 指向同一个数,最后分别枚举。
4、请看上图,即使 left 右移一位,都是 right 最终也会指向和第一个数 right 最终的指向一样,而且它的长度绝对小于第一个数到 right 之间的长度,所以最好的解决办法是 right 在右移时,只要 zero > k,就让 left 也往右移(在右移的过程中遇到 0 ,就 zero--),直到 left 到 right 之间的 zero <= k。
5.每次 right 向右移时都要记录最长的长度。
三、代码实现
class Solution {
public:int longestOnes(vector<int>& nums, int k) {int left = 0,right = 0,zero = 0;int ret = 0;while(right < nums.size()){if(nums[right] == 0){zero++;}while(zero > k){if(nums[left++] == 0) zero--;}ret = max(ret,right - left + 1);right++;}return ret;}
};