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;
    }
}
相关推荐
码爸3 小时前
线性回归算法
算法·机器学习·线性回归
kimnoic4 小时前
Python数据库学习心得:SQLite、MySQL、PostgreSQL优缺点
开发语言·python
Coder-magician4 小时前
《代码随想录》刷题打卡day51:图论-part09(dijistra堆优化,Bellman_ford算法)
算法·图论
Nil2084 小时前
leetcode 763划分字母区间
算法·leetcode·职场和发展
不会就选b4 小时前
算法日常・每日刷题--<动态规划>20
算法·leetcode·动态规划
别动我齐刘海4 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
必须得开心呀5 小时前
python编写带界面的软件,需要安装哪些插件
开发语言·python
青少儿编程课堂5 小时前
迪杰斯特拉(Dijkstra)算法:单源最短路与赛场路线规划
c++·python·算法·bfs·信息学竞赛
不会就选b5 小时前
算法日常・每日刷题--<动态规划>19
算法·leetcode·职场和发展
code2cat6 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程