所有的平靜都是來自於認識到事物並非我們所想的那樣。
閒來無事刷道題唄。
題目介紹
簡單的說,假如你有 N 枚硬幣,需要擺成階梯的形式,即第 N 行一定有 N 個硬幣。求最多能擺多少行。
題目分析
最直觀的解法,因為我們知道第 N 行必須要需要 N 個硬幣。所以我們只要從第一行開始,每加一行減掉對應所需 X 個。什麼時候總數不夠了,那麼遊戲到此結束。
解法一
/**
* @param Integer $n
* @return Integer
*/
function arrangeCoins($n)
{
$i = 1;
if ($n == 0) return 0;
while ($n > 0) {
$n -= $i;
$i++;
if ($n < $i) return $i - 1;
}
}
這種解法時間複雜度 O(n),空間複雜度 O(1)。空間複雜度無需再優化了,可以看看能否在時間上動動手腳。
解法二
這時間上優化先看看從 O(n) 到 O(log2n) 。臺階 1-n ,本質上就是一個有序的集合,既然是有序,當然就可以用到 Binary Search 的思想。每次找到中位數,計算中位數m(即第m行)所需要的硬幣總和和給定的硬幣數進行比較,不斷壓縮空間。
/**
* @param Integer $n
* @return Integer
*/
function arrangeCoins($n)
{
$left = 0;
$right = $n;
while ($left < $right) {
$middle = $left + (($right - $left + 1) >> 1);
//$middleSum=($middle*$middle+$middle)/2;
$middleSum = $middle * ($middle + 1) / 2;
if ($middleSum <= $n) {
$left = $middle;
} else {
$right = $middle - 1;
}
}
return $left;
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結