【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数

简介: 【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数

题目1:1004.最大连续1的个数 III

思路分析:

如果我们根据题干意思来做,每次寻找并翻转k个0的话,难度还是比较大,很复杂。我们不妨使用zero计数器来控制0的数量,控制在

思路1:暴力枚举+zero计数器

思路2:滑动窗口+zero计数器

本题滑动窗口分析:

1. 进窗口: 当 nums[right]!=0或者zero小于k,就进窗口,执行 right++。意思就是right++就代表符合题意。

2. 判断: 主要目的是更新 left到符合题干的位置,即: 减去一个零,使得zero计数器为k的位置。更新到位置也就完成了 出窗口。

3. 更新结果: ret是满足一个就更新一次,进窗口就是增加,出窗口就是减小(所以要和之前的比对,取最大)。

代码实现:

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int left=0,right=0,n=nums.size();
        int zero=0,ret=0;
        while(right<n)
        {
            if(nums[right]==0) zero++; //zero计数器
            while(zero>k)           //出窗口
                if(nums[left++]==0) 
                    zero--;
            ret=max(ret,right-left+1);//更新结果
            right++;        //符合要求进窗口-->right++;
        }
        return ret;
    }
};


LeetCode链接:1004.最大连续1的个数


题目2:1658. 将x减到0的最小操作数

思路分析:

一会左删一会右删,让删除的总数等于x,这道题我们直接做会很难。

不妨正难则反:中间的部分的和一直是:sum-x,要求删除最少,那就是中间长度最长。这样题目要求就变成了:找子数组的和等于target=sum-x的最长子数组。

思路1:暴力枚举

思路2:滑动窗口O(N)

本题滑动窗口分析:

1. 进窗口: 维护数据 sum1, right++进窗口。

2. 判断: 如果 sum1>target,则需要出窗口来减少 sum1。出窗口操作: sum1-=nums[left++];

3. 更新结果: 需要满足条件再更新结果: if(sum1==target) ret=max(ret,right-left+1);

代码实现:

class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int left=0,right=0,n=nums.size();
        int sum=0,sum1=0,ret=-1;、
        //求和
        for(int i=0;i<n;i++)
            sum += nums[i];
        int target=sum-x;
        //细节处理:
        if(target<0) return -1;

        while(right<n)
        {
            sum1+=nums[right];              //进窗口
            while(sum1>target)              //判断
                sum1-=nums[left++];         //出窗口
            if(sum1==target)
                ret=max(ret,right-left+1);  //更新结果
            right++;
        }
        return (ret==-1?ret:n-ret);
    }
};

LeetCode链接:1658. 将x减到0的最小操作数


收获满满✨:

  • 正难则反,这个往往是最难的,需要多多体会。
  • 体会进窗口和出窗口,理解方式多样。
相关文章
|
4天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
82 2
|
4天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
39 3
|
2月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
17 3
|
2月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
18 1
|
2月前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
20 1
|
2月前
|
算法 Python
【Leetcode刷题Python】295. 数据流的中位数
本文介绍了一种使用Python实现的数据结构,用以支持数据流中添加整数并返回当前所有元素的中位数,通过排序列表来计算中位数。
16 1
|
2月前
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
19 0
【Leetcode刷题Python】73. 矩阵置零
|
2月前
|
Python
【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
24 0