Leetcode 解析 (441. Arranging Coins)

Remember發表於2020-07-12

所有的平靜都是來自於認識到事物並非我們所想的那樣。

閒來無事刷道題唄。

題目介紹

簡單的說,假如你有 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 協議》,轉載必須註明作者和本文連結

吳親庫裡

相關文章