力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

硬往题目介绍上边去想的话其实非常困难,如果换种方式思考就会简单许多。
若我们将思想转化为,找出最长的子串(里面含有的0的数量最大为k),然后返回其最长长度。
这样思路就清晰了许多,那么我们使用一个zero变量来记录0的个数,利用滑动窗口思想来解决,若当前进窗口的值是0那么zero++,若出窗口的该值是0那么zero--,保证zero<=k即可。
- class Solution
- {
- public:
- int longestOnes(vector<int>& nums, int k)
- {
- int n=nums.size();
- int ret=0;
- for(int left=0,zero=0,right=0;right
- {
- // 进窗口
- // 如果该数是0 那么我们zero变量就++
- if(nums[right]==0) zero++;
- // 出窗口
- // 若此时zero的大小已经大于k
- while(zero>k)
- {
- // 出窗口
- if(nums[left]==0)
- zero--;
- // 更新窗口
- left++;
- }
- // 更新结果
- ret=max(ret,right-left+1);
- }
- return ret;
- }
- };