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;
    }
}
相关推荐
业精于勤的牙21 小时前
浅谈:算法中的斐波那契数(二)
算法·职场和发展
陈文锦丫21 小时前
MQ的学习
java·开发语言
乌暮21 小时前
JavaEE初阶---线程安全问题
java·java-ee
爱笑的眼睛111 天前
GraphQL:从数据查询到应用架构的范式演进
java·人工智能·python·ai
不穿格子的程序员1 天前
从零开始写算法——链表篇4:删除链表的倒数第 N 个结点 + 两两交换链表中的节点
数据结构·算法·链表
liwulin05061 天前
【PYTHON-YOLOV8N】如何自定义数据集
开发语言·python·yolo
liuyao_xianhui1 天前
寻找峰值--优选算法(二分查找法)
算法
dragoooon341 天前
[hot100 NO.19~24]
数据结构·算法
Seven971 天前
剑指offer-52、正则表达式匹配
java
代码or搬砖1 天前
RBAC(权限认证)小例子
java·数据库·spring boot