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;
    }
}
相关推荐
FPGAI几秒前
Python之函数
开发语言·python
csbysj20203 分钟前
NumPy Ndarray 对象
开发语言
Z1Jxxx4 分钟前
删除字符串2
开发语言·c++·算法
踩坑记录6 分钟前
leetcode hot100 15. 三数之和 medium
算法·leetcode·职场和发展
小CC吃豆子8 分钟前
Qt的信号与槽机制
开发语言·数据库·qt
你的冰西瓜11 分钟前
C++中的set容器详解
开发语言·c++·stl
独自破碎E12 分钟前
【二分法】旋转数组的最小数字
数据结构·算法·排序算法
alonewolf_9912 分钟前
JDK17 GC调优全攻略:从参数解析到实战优化
java·jvm
weixin_4624462316 分钟前
使用 Python 创建和导出 Jupyter Notebook:从零到一的完整教程
开发语言·python·jupyter
苦藤新鸡16 分钟前
9.找到字符串中所有字母异位词
数据结构·c++·算法·力扣