C.滑动窗口——1423. 可获得的最大点数

题目链接:1423. 可获得的最大点数(中等)

算法原理:

👉对应力扣题解

解法:滑动窗口

击败88.38%

时间复杂度O(N)

由于每次只从两侧选取最大值,故中间部分必然连续

问题由此可转化成:

窗口大小:n-k(n是数组长度),找窗口内最小值,返回值:总和-窗口内最小和

其余跟C.滑动窗口------1456. 定长子串中元音的最大数目(模板题)一样

**小细节:**当窗口大小==0时,left会越界访问,所以直接返回数组内所有元素的和即可

注:此题不能贪心

java 复制代码
class Solution {
    public int maxScore(int[] nums, int k) {
        int n=nums.length;
        int ret=0,len=0;
        int left=0,right=n-1;
        while(left<=right){
            if(nums[left]>=nums[right]) ret+=nums[left++];
            else ret+=nums[right--];
            len++;
            if(len==k) return ret;
        }
        return 0;
    }
}

当案例是[1,2,3,4,5,6,1]时贪左边,会导致选左边,右边同理

JAVA代码:

java 复制代码
class Solution {
    public int maxScore(int[] nums, int kk) {
        //解法:滑动窗口
        //问题转换:窗口长度:n-k,找窗口内的最小值
        int n=nums.length;
        int k=n-kk,ret=0x3f3f3f3f,sum=0;
        int total=0;
        for(int x:nums) total+=x;
        if(k==0) return total;
        for(int right=0;right<n;right++){
            int left=right-k+1;
            //进窗口
            sum+=nums[right];
            if(left<0) continue;
            //更新
            ret=Math.min(ret,sum);
            //出窗口
            sum-=nums[left];
        }
        return total-ret;
    }
}
相关推荐
关于不上作者榜就原神启动那件事几秒前
Java中大量数据Excel导入导出的实现方案
java·开发语言·excel
坚定学代码7 分钟前
基于观察者模式的ISO C++信号槽实现
开发语言·c++·观察者模式·ai
Wang's Blog22 分钟前
Nodejs-HardCore: Buffer操作、Base64编码与zlib压缩实战
开发语言·nodejs
Coder_Boy_28 分钟前
基于SpringAI的在线考试系统设计总案-知识点管理模块详细设计
android·java·javascript
csbysj202029 分钟前
C# 集合(Collection)
开发语言
Assby35 分钟前
如何尽可能精确计算线程池执行 shutdown() 后的耗时?
java·后端
csbysj202043 分钟前
Lua 面向对象编程
开发语言
汽车仪器仪表相关领域1 小时前
全自动化精准检测,赋能高效年检——NHD-6108全自动远、近光检测仪项目实战分享
大数据·人工智能·功能测试·算法·安全·自动化·压力测试
焰火19991 小时前
[Java]自定义重试工具类
java