幾張卡牌 排成一行,每張卡牌都有乙個對應的點數。點數由整數陣列 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個元素的值,然後每一回合,尾端數量+1, 首端數量-1,然後比較求出最大值。
class
solution}if
(ksum=maxsum;
//注意此時要將sum值置為前k個元素的和值,方便邊計算邊比較。
for(
int i=k;i>
0;i--)}
return maxsum;}}
;
方法二:(借鑑別人的思路)
題目要求從兩端取k個數,因此可以發現最後剩下的n-k張一定是連續的。因此可以逆向思維,求所有連續的n-k個數的最小和,這樣子剩下的k個就是最大的。
圖借鑑於leetcode題解。
}//找出連續的n-k個數的最小值。
return sum-res;}}
;
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...
LeetCode每日一題(題139)
題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...