• 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;
        }
    };
  • 相关阅读:
    018_STM32程序移植之_串口接收中文
    003_软件安装之_Visual Studio 2012
    001_C#我的第一个串口上位机软件
    017_STM32程序移植之_AS608指纹模块
    016_STM32程序移植之_舵机
    015_STM32程序移植之_NRF24L01模块
    014_STM32程序移植之_L298N电机驱动模块
    002_89C52_Proteus_DAC0832_输出50HZ,正弦波,三角波,矩形波,锯齿波
    001_89C52之_Proteus_ADC0809采集电压
    001_电子工程师招聘笔试题及详细解析
  • 原文地址:https://www.cnblogs.com/ttzz/p/14380820.html
Copyright © 2020-2023  润新知