前往
大廳
主題

LeetCode - 1423. Maximum Points You Can Obtain from Cards 解題心得

Not In My Back Yard | 2021-06-08 00:00:03 | 巴幣 0 | 人氣 258

題目連結:


題目意譯:
現在有著若干張卡排成一列,且每張卡有著一個對應的點數。點數給定於整數陣列 cardPoints。

在一步操作中,你可以從列的開頭或結尾拿走一張卡。你必須拿走恰好 k 張卡。

你的分數為你拿走的卡之點數總和。

給定整數陣列 cardPoints 以及整數 k ,回傳你可以獲得的最大分數。

限制:
1 ≦ cardPoints.length ≦ 10 ^ 5
1 ≦ cardPoints[i] ≦ 10 ^ 4
1 ≦ k ≦ cardPoints.length



範例測資:
範例 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 個數字的總和(頭尾也算相連)哪個最大即可。不過正因為頭尾相連,所以會出現
1,2,3,4,5,6,1
或是
1,2,3,4,5,6,1
這種看似不連續的區間。

所以我們可以反過來窮舉出所有 (cardPoints.length - k) 個數字之總和(這次就不需要考慮頭尾相連了,窮舉方式可以參見這題) S,看哪個 S 值最小即可得出所求為 T - S。其中 T 為 cardPoints 中所有數字之和。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作