題目連結:
題目意譯:
現在有著若干張卡排成一列,且每張卡有著一個對應的點數。點數給定於整數陣列 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 中所有數字之和。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。