可獲得的最大點數
阿新 • • 發佈:2021-02-08
可獲得的最大點數
滑動視窗的方法
思路:設計陣列cardPoints,陣列的長度為l,由於只可以在左邊或者右邊去拿卡牌,中間留下的肯定是一個l-k的連續陣列,這樣就可以用一個滑動視窗來寫。
可以先求出連續子陣列l-k的最小值,這樣就可以得到拿走k張卡牌的最大值。
java程式碼:
package 可獲得的最大點數;
import java.util.Arrays;
import java.util.Scanner;
public class Solution {
public int maxScore(int[] cardPoints, int k) {
int l=cardPoints.length;
int sum=0;
for(int i=0;i<Windowsize;i++) {
sum+=cardPoints[i];
}
int Minsum=sum;
for(int i=Windowsize;i<l;i++) {
sum+=cardPoints[i]-cardPoints[i-Windowsize];
Minsum=Math.min(sum,Minsum);
}
return Arrays.stream(cardPoints).sum()-Minsum;
} public static void main(String[] args) { // TODO 自動生成的方法存根 int a[]= {1,2,3,4,5,6,1}; Scanner sc=new Scanner(System.in); int k=sc.nextInt(); Solution s=new Solution(); System.out.println(s.maxScore(a, k)); }
}
執行截圖:
定義的陣列為int a[]= {1,2,3,4,5,6,1};
輸入k的值為3 ,得到的最大值為12;
複雜度分析:
時間複雜度:O(n),其中n為陣列長度l,
空間複雜度:O(1)
總結:
初步瞭解到stream的使用,可以將陣列中的元素遍歷一遍,在用sum()方法求出陣列元素的總和。
本次做題有參考到力扣官網的解法,十分感謝!
地址連結:https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards/solution/ke-huo-de-de-zui-da-dian-shu-by-leetcode-7je9/