如題~
幾張卡牌 排成一行,每張卡牌都有一個對應的點數,點數由整數陣列 cardPoints 給出,
每次行動,你可以從行的開頭或者末尾拿一張卡牌,最終你必須正好拿 k 張卡牌,
你的點數就是你拿到手中的所有卡牌的點數之和,
給一個整數陣列 cardPoints 和整數 k,請你回傳可以獲得的最大點數,
示例 1:
輸入:cardPoints = [1,2,3,4,5,6,1], k = 3
輸出:12
解釋:第一次行動,不管拿哪張牌,你的點數總是 1 ,但是,先拿最右邊的卡牌將會最大化你的可獲得點數,最優策略是拿右邊的三張牌,最終點數為 1 + 6 + 5 = 12 ,
這樣,你應該就明白了,
根據這是個滑動陣列月,
我首先就想到滑動陣列,從左邊開始K個,計算大小,然后左邊的K個減去最后邊那個,再在最右邊選一個,
這樣,我順利的寫出了代碼,,,
代碼如下:
int maxScore(int* cardPoints, int cardPointsSize, int k){
int end = 0;
int num;
for(int j=0;j<k;j++)
{
num += cardPoints[j];
}
for(int i=0;i<k;i++)
{
end = fmax(num,end);
num = num - cardPoints[i] + cardPoints[cardPointsSize - i];
}
return end;
}
但是呢,啪的一下,很快啊,

????為啥會出錯,而且,出的錯,我還看不懂啥意思????
我又換了種方法,把里面的數,改成滑動視窗,然后,就行了?
ok:
int maxScore(int* cardPoints, int cardPointsSize, int k){
int n = cardPointsSize; // 滑動視窗大小為 n-k
int a = n - k;
int sum = 0;
for (int i = 0; i < a; i++)
{
sum += cardPoints[i];
}
int Max = sum;
int minSum = sum;
for (int i = a; i < n; ++i)
{
// 滑動視窗每向右移動一格,增加從右側進入視窗的元素值,并減少從左側離開視窗的元素值
sum += cardPoints[i] - cardPoints[i - a];
minSum = fmin(minSum, sum);
Max += cardPoints[i];
}
return Max - minSum;
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257351.html
標籤:其他
上一篇:合成大西瓜自制版教程
