zoukankan      html  css  js  c++  java
  • 1423. 可获得的最大点数(滑动窗口)

    一、题目描述

    几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
    每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。
    你的点数就是你拿到手中的所有卡牌的点数之和。
    给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。
    示例 1:
    输入:cardPoints = [1,2,3,4,5,6,1], k = 3
    输出:12
    解释:第一次行动,不管拿哪张牌,你的点数总是 1 。但是,先拿最右边的卡牌将会最大化你的可获得点数。最优策略是拿右边的三张牌,最终点数为 1 + 6 + 5 = 12 。
    示例 2:
    输入:cardPoints = [2,2,2], k = 2
    输出:4
    解释:无论你拿起哪两张卡牌,可获得的点数总是 4 。
    示例 3:
    输入:cardPoints = [9,7,7,9,7,7,9], k = 7
    输出:55
    解释:你必须拿起所有卡牌,可以获得的点数为所有卡牌的点数之和。
    示例 4:
    输入:cardPoints = [1,1000,1], k = 1
    输出:1
    解释:你无法拿到中间那张卡牌,所以可以获得的最大点数为 1 。
    示例 5:
    输入:cardPoints = [1,79,80,1,1,1,200,1], k = 3
    输出:202

    二、题解

    方法一:通过首尾拼接,以k作为滑动窗口的大小。

    class Solution {
        public int maxScore(int[] cardPoints, int k) {
            int k2 = 2 * k;
            int[] arr = new int[k2];
            int n = cardPoints.length;
            for(int i=0;i<k;i++){
                arr[i] = cardPoints[n-k+i];
            }
            int j=0;
            for(int i=k;i<k2;i++){
                arr[i] = cardPoints[j++];
            }
            int sum = 0;
            for(int i=0;i<k;i++){
                sum += arr[i];
            }
            int ans = sum;
            for(int i = k;i<k2;i++){
                sum += arr[i];
                sum -= arr[i-k];
                ans = Math.max(ans,sum);
            }
            return ans;
        }
    }

    方法二:通过求出剩余卡牌点数之和的最小值,来求出拿走卡牌点数之和的最大值。

    class Solution {
    public:
        int maxScore(vector<int>& cardPoints, int k) {
            int n = cardPoints.size();
            int wl = n - k;//窗口长度
            int sum = accumulate(cardPoints.begin(),cardPoints.begin()+wl,0);
            int minSum = sum;
            for(int i=wl;i<n;i++){   
                sum += cardPoints[i]-cardPoints[i-wl];
                minSum = min(minSum,sum);
            }
            return accumulate(cardPoints.begin(),cardPoints.end(),0)-minSum;
        }
    };
  • 相关阅读:
    安装cloudbase-init和qga批处理
    Windows添加自定义服务、批处理文件开机自启动方法
    Windows批处理:自动部署常用软件(静默安装)
    windows auto activate
    XML转译字符
    Leetcode908.Smallest Range I最小差值1
    Leetcode917.Reverse Only Letters仅仅反转字母
    Leetcode896.Monotonic Array单调数列
    Leetcode905.Sort Array By Parity按奇偶排序数组
    Leetcode892.Surface Area of 3D Shapes三维形体的表面积
  • 原文地址:https://www.cnblogs.com/ttzz/p/14380820.html
Copyright © 2011-2022 走看看