1. 程式人生 > 其它 >可獲得的最大點數

可獲得的最大點數

技術標籤:javajava

可獲得的最大點數

滑動視窗的方法
思路:設計陣列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 Windowsize=l-k;
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/