模...本來想歸類到模擬的, 看了看下面的標籤還是放到滑動視窗好了
選擇一邊的端點石子, 每次都移動到與原位置盡可能近的位置
除了首次選擇的起點, 剩餘空位置的總會被填充一次石子
由此可以得到最大值的公式, 用間距之和減去首尾較短的那段間距
maxnum = sumgap - min(gap.front(), gap.back())
從結果反推, 最終所有石子都會落在乙個連續區間中
為了移動次數最小, 區間外每個石子只移動一次就到達最終位置
隨著區間不斷縮小, 最後區間的端點石子至少有一顆沒有移動過
此時稍微轉換一下問題, 就能依靠原始石子的位置選擇區間範圍, 區間外的石子可視為自由石子, 最終目的為盡可能填充滿區間(忽略細節)
為了便於判斷, 劃分出2個我們需要的變數
sum
: 區間外的自由石子數, 可以用來自由移動
gap
: 區間內需要填充的空白位置數
在不斷變化區間(移動視窗)的過程中, 再劃分區間改變的幾個條件
sum < gap
: 自由石子數量小於空白位置, 需要額外移動一次端點石子, 完成移動需要的次數為sum + 1
, 期望減小區間
sum == gap
: 自由石子數量等於空白位置, 完成移動需要的次數恰好為為sum
, 期望移動區間
sum > gap
: 自由石子數量大於空白位置, 期望增大區間
sum == 0
: 自由石子數量不足, 期望減小區間
要是不嫌煩的話, 還能對具體實現做一下優化...(懶癌發作)
class solution
if (sumgap < gapnum) else if (sumgap == gapnum) else
}return ;
}};
leetcode移動元素
解題要求 給定乙個陣列 nums 和乙個值 val,你需要原地移除所有數值等於 val 的元素,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。附上 class solutio...
LeetCode877 石子遊戲
亞歷克斯和李用幾堆石子在做遊戲。偶數堆石子排成一行,每堆都有正整數顆石子 piles i 遊戲以誰手中的石子最多來決出勝負。石子的總數是奇數,所以沒有平局。亞歷克斯和李輪流進行,亞歷克斯先開始。每回合,玩家從行的開始或結束處取走整堆石頭。這種情況一直持續到沒有更多的石子堆為止,此時手中石子最多的玩家...
LeetCode 877 石子遊戲
usr bin python3 coding utf 8 time 2019 3 16 author xfli the file.這是乙個數學問題,要注意的有兩點,第一,有偶數堆,第二,總數為奇數,不存在平局。所以這樣想,如果有2堆,亞歷克斯選乙個多的,肯定贏了,如果有4堆,平分兩堆,亞歷克斯每兩堆...