首页 > 其他分享 >leetcode刷题笔记--最大滑动窗口

leetcode刷题笔记--最大滑动窗口

时间:2024-11-11 20:14:36浏览次数:3  
标签:right 窗口 nums -- ++ int answerKey leetcode 刷题

class Solution {
    public int longestOnes(int[] nums, int k) {
        int l = 0, r = 0;
        while (r < nums.length) {
            if (nums[r++] == 0) {
                k--;
            }
            if (k < 0 && nums[l++] == 0) {
                k++;
            }
        }
        return r - l;
    }
}

. - 力扣(LeetCode)

给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。

示例 1:

输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出:6
解释:[1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 6。

示例 2:

输入:nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
输出:10
解释:[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 10。

题解里找到的一个大佬的写法。记录一下

大佬的解释:

是的,这个写法维护的是一个只能单调变长的窗口。这种窗口经常出现在寻求”最大窗口“的问题中:因为要求的是”最大“,所以我们没有必要缩短窗口,于是代码就少了缩短窗口的部分;从另一个角度讲,本题里的K是消耗品,一旦透支,窗口就不能再增长了(也意味着如果K == 0还是有可能增长的)。所以K所代表的”资源“,通常是滑窗维护逻辑的核心,能这么写有两个先决条件:

  • 固定一个左端点,K随窗口增大是单调变化的。据此我们可以推知长度为n的窗口如若已经”透支“(K < 0)了,那么长度大于n的也一定不符合条件;
  • K的变化与数组元素有简单的算术关系。向窗口纳入(A[r++])或移除(A[l++])一个数组元素,可以在O(1)内更新K

虽说有条件,但仔细排查会发现许多滑窗问题都可以满足。

. - 力扣(LeetCode)

一位老师正在出一场由 n 道判断题构成的考试,每道题的答案为 true (用 'T' 表示)或者 false (用 'F' 表示)。老师想增加学生对自己做出答案的不确定性,方法是 最大化 有 连续相同 结果的题数。(也就是连续出现 true 或者连续出现 false)。

给你一个字符串 answerKey ,其中 answerKey[i] 是第 i 个问题的正确结果。除此以外,还给你一个整数 k ,表示你能进行以下操作的最多次数:

  • 每次操作中,将问题的正确答案改为 'T' 或者 'F' (也就是将 answerKey[i] 改为 'T' 或者 'F' )。

请你返回在不超过 k 次操作的情况下,最大 连续 'T' 或者 'F' 的数目。

示例 1:

输入:answerKey = "TTFF", k = 2
输出:4
解释:我们可以将两个 'F' 都变为 'T' ,得到 answerKey = "TTTT" 。
总共有四个连续的 'T' 。

这个题目就可以用两次上面的方法,分别求出最大连续T和最大连续F,再比较两者大小;

class Solution {
    public int maxConsecutiveAnswers(String answerKey, int k) {
        int l=0,r=0;
        int k2=k;
        while(r<answerKey.length()){
            if(answerKey.charAt(r++)=='F') k--;
            if(k<0 && answerKey.charAt(l++)=='F') k++;
        }
        int temp=r-l;
        r=l=0;
        while(r<answerKey.length()){
            if(answerKey.charAt(r++)=='T') k2--;
            if(k2<0 && answerKey.charAt(l++)=='T') k2++;
        }
        return Math.max(r-l,temp);
    }
}

或者可以在窗口中同时记录T和F的个数,只要T和F的数量有一种小于k就行(这样就能把少的全变成多的)代码如下

class Solution {  
    public int maxConsecutiveAnswers(String answerKey, int k) {  
        int left = 0, right = 0;  
        int countF = 0; // Count of 'F's in the current window  
        int countT = 0; // Count of 'T's in the current window  
        int ans=0;
        while (right < answerKey.length()) {  
            // Expand the window by including answerKey[right]  
            if (answerKey.charAt(right) == 'F') {  
                countF++;  
            } else {  
                countT++;  
            }  
            right++;  
            
            // If we exceed k flips, we need to shrink the window  
            while (countF > k && countT > k) {  
                if (answerKey.charAt(left) == 'F') {  
                    countF--;  
                } else {  
                    countT--;  
                }  
                left++;  
            }
            ans = Math.max(ans,countF+countT);
        }  
        return ans;  
    }  
}

标签:right,窗口,nums,--,++,int,answerKey,leetcode,刷题
From: https://blog.csdn.net/px0405/article/details/143692901

相关文章

  • Cangjie—仓颉编程-Hello,World
    仓颉工具链cjc(Compiler编译CJPM(CangjiePackageManager)cjpm是仓颉语言的包管理工具cjdb(Debugger)cjdb是一款基于开源LLDB开发的仓颉调试工具cjfmt(CangjieFormatter)代码自动格式化工具。cjcov(CangjieCoverage)官方覆盖率统......
  • JavaScript on html
    我咋没发啊,丢草稿箱里给忘了,发一下好像早就写了首先你要会一点html一点都不会建议学了再来Vscode自带html+JS自动补全,比较好用不会运行JS建议多动脑子调用可以用<script>调用也可以以字符串形式写在超链接的地方弱类型语言,变量用var定义(=new()格式下可以不......
  • [极客大挑战 2019]LoveSQL
    打开是一个登录界面使用admin'or1#万能密码绕过密码登录再使用admin'orderby3#找回显的列数,结果为3,再使用a'unionselect1,2,3#找回显的列,结果为2,3后面就是常规的union注入流程#找数据库和表名a'unionselect1,database(),group_concat(table_name)frominfor......
  • 关于右值引用测试
    不论在win:vs,gcc测试,使用RightValue,性能出现下降  在Llvm下,使用RightValue,性能也出现下降: 测试参考之前的博客代码,现有的代码也可以:#include<iostream>#include<vector>#include<utility>#include<chrono>usingnamespacestd;usingnamespacestd::chrono;......
  • P8162 [JOI 2022 Final] 让我们赢得选举 (Let's Win the Election) 题解
    P8162[JOI2022Final]让我们赢得选举(Let'sWintheElection)题解朴素的想法是先抓一部分人,再一起去发表演讲。这样就要按\(b\)的值从小到大排序,枚举选择的一部分\(b\)值,在后面挑选一些最小的\(a\)选择即可。但这样显然是错误的。观察到\(n\le500\),显然是\(O(n^3......
  • 今年测试这工资是认真的吗?
    ......
  • 开发人员,千万不要去碰那该死的业务参数,无论什么时候!
    你好呀,我是歪歪。前几天发了一个牢骚:本来只是单纯的吐槽一下,但是好多人对其中的细节比较感兴趣。大家都是搞技术的嘛,对于“踩BUG”这种喜闻乐见的事情,有兴趣是很正常的。其实我这个BUG,其实严格意义上不能叫做BUG,因为和程序无关,甚至和技术的关系都不算大。从标题上你也能猜......
  • java小课设:使用MySQL做一个聊天室
    bro是个懒狗,耗时一个晚上,只写了一些基础功能,其他的可以根据需要自己添加实现思路:在MySQL数据库中设置一个message表,用来存储聊天信息,聊天界面输入的内容写入message表,用户程序每秒从MySQL中获取一次聊天记录,并加载进入自己的页面,实现聊天室。食用方法:ChatServer类中的数据......
  • Quartz集群增强版_00.How to use?(如何使用)
    Quartz集群增强版_00.Howtouse?(如何使用)转载请著名出处https://www.cnblogs.com/funnyzpc/p/18540378开源地址https://github.com/funnyzpc/quartz表的基本结构    总的来说任务的配置及开发基本遵从上图的表的基本关系,除app以及node之外均需要手动手动配置......
  • 12.享元模式设计思想
    12.享元模式设计思想目录介绍01.享元模式基础介绍1.1享元模式由来1.2享元模式定义1.3享元模式场景1.4享元模式思考1.5核心思想是什么02.享元模式原理与实现2.1罗列一个场景2.2用例子理解享元2.3内部和外部状态2.4享元模式实现03.享元模式分析3.1......