1. 程式人生 > 其它 >LeetCode——441. 排列硬幣(Java)

LeetCode——441. 排列硬幣(Java)

題目描述

題幹:
你總共有n枚硬幣,並計劃將它們按階梯狀排列
對於一個由 k 行組成的階梯,其第 i 行必須正好有 i 枚硬幣
階梯的最後一行 可能 是不完整的。
給你一個數字n ,計算並返回可形成 完整階梯行 的總行數。

示例 1:
輸入:n = 5
輸出:2
解釋:因為第三行不完整,所以返回 2 。

示例 2:
輸入:n = 8
輸出:3
解釋:因為第四行不完整,所以返回 3 。

題解思路

返回硬幣可以完整填滿的階梯數,看到階梯首先想到的就是類似楊輝三角形採用遍歷

記錄每層的數量和之前的數目和,顯然這種暴力模型會超時,再優化想到二分的方法

因為按照臺階來排列,n/2就是它的高度,但是完整的長度還是得按照等差數列公式

如果我們解這個公式還可以用解直接返回答案,這就是數學的魅力

正確程式碼

    public int arrangeCoins(int n) {
        int left = 1, right = n;
        while (left < right) {
            int mid = left + (right - left) / 2;

            if ((long) mid * (mid + 1) <= (long) 2 * n) {
                left = mid;
            } else {
                right = mid;
            }
        }
        return left;
    }

    public int arrangeCoins1(int n) {
        return (int) ((Math.sqrt((long) 8 * n + 1) - 1) / 2);
    }

總結

數學模型的建立都伴隨著總結的公式出現,所以以後遇到要先思考模型的規律

如果文章存在問題或者有更好的題解,歡迎在評論區斧正和評論,各自努力,你我最高處見