LeetCode——441. 排列硬幣(Java)
阿新 • • 發佈:2021-10-10
題目描述
題幹:
你總共有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); }
總結
數學模型的建立都伴隨著總結的公式出現,所以以後遇到要先思考模型的規律
如果文章存在問題或者有更好的題解,歡迎在評論區斧正和評論,各自努力,你我最高處見