LeetCode C++ 441. Arranging Coins【Math/Binary Search】簡單
You have a total of n
coins that you want to form in a staircase shape, where every k-th
row must have exactly k
coins.
Given n
, find the total number of full staircase rows that can be formed.
n
is a non-negative integer and fits within the range of a 32-bit signed integer.
Example 1:
n = 5
The coins can form the following rows:
¤
¤ ¤
¤ ¤
Because the 3rd row is incomplete, we return 2.
Example 2:
n = 8
The coins can form the following rows:
¤
¤ ¤
¤ ¤ ¤
¤ ¤
Because the 4th row is incomplete, we return 3.
題意:總共有 n
枚硬幣,需要將它們擺成一個階梯形狀,第 k
行必須正好有 k
枚硬幣。找出可形成完整階梯行的總行數。
解法1 迭代
class Solution {
public:
int arrangeCoins(int n) {
if (n <= 1) return n; //n=0->0, n=1->1
int level = 0;
for (int i = 1; n - i >= 0; ++i) {
++level;
n -= i;
}
return level;
}
};
提交後執行效率如下:
執行用時:16 ms, 在所有 C++ 提交中擊敗了19.02% 的使用者
記憶體消耗:6.1 MB, 在所有 C++ 提交中擊敗了20.29% 的使用者
或者寫成如下形式:
class Solution {
public:
int arrangeCoins(int n) {
int level = 1;
while (n >= level) {
n -= level;
++level;
}
return level - 1;
}
};
解法2 二分
不斷二分答案,同時運用等差數列求和公式求和,和 n
比較來縮小答案範圍:
class Solution {
public:
int arrangeCoins(int n) {
if (n <= 1) return n; //特判,注意:n=1不存在第一個滿足mid*(mid+1)>2n的mid
uint64_t lo = 0, hi = n, mid, n2 = 2ull * n; //找到最後一個滿足mid*(mid+1)<=2n的mid
while (lo < hi) { //找到第一個滿足mid*(mid+1)>2n的mid
mid = lo + (hi - lo) / 2;
if ((mid + 1) * mid > n2) hi = mid;
else lo = mid + 1;
}
return lo - 1;
}
};
提交後效率如下:
執行用時:4 ms, 在所有 C++ 提交中擊敗了81.62% 的使用者
記憶體消耗:6.3 MB, 在所有 C++ 提交中擊敗了5.78% 的使用者
解法3 數學
最多有 x x x 層,每層 x x x 個硬幣,於是有 x ∗ ( x + 1 ) ≤ 2 ∗ n x * (x + 1) \le 2 * n x∗(x+1)≤2∗n ,使用一元二次方程的求根公式解出 x x x 即可: x = − b ± Δ 2 a = − b ± b 2 − 4 a c 2 a x = \frac{-b \pm \sqrt{\Delta}}{2a} = \frac{-b\pm \sqrt{b^2-4ac}}{2a} x=2a−b±Δ=2a−b±b2−4ac
class Solution {
public:
int arrangeCoins(int n) {
return (-1 + sqrt(1 + 8ll * n)) / 2;
}
};
效率最高:
執行用時:0 ms, 在所有 C++ 提交中擊敗了100.00% 的使用者
記憶體消耗:6.2 MB, 在所有 C++ 提交中擊敗了14.59% 的使用者
相關文章
- 【Leetcode】441. Arranging CoinsLeetCode
- Leetcode 441. Arranging CoinsLeetCode
- Leetcode 解析 (441. Arranging Coins)LeetCode
- Leetcode Unique Binary Search TreesLeetCode
- LeetCode C++ 204. Count Primes【Math/Hash Table】簡單LeetCodeC++
- Leetcode Validate Binary Search TreeLeetCode
- Leetcode-Unique Binary Search TreesLeetCode
- leetcode 之 Recover Binary Search TreeLeetCode
- Unique Binary Search Trees leetcode javaLeetCodeJava
- Recover Binary Search Tree leetcode javaLeetCodeJava
- 【LeetCode從零單排】No96 Unique Binary Search TreesLeetCode
- LeetCode-Closest Binary Search Tree ValueLeetCode
- Leetcode-Unique Binary Search Trees IILeetCode
- Unique Binary Search Trees II leetcode javaLeetCodeJava
- Validate Binary Search Tree leetcode javaLeetCodeJava
- LeetCode 98. Validate Binary Search TreeLeetCode
- LeetCode-Closest Binary Search Tree Value IILeetCode
- 【LeetCode】Convert Sorted List to Binary Search TreeLeetCode
- Leetcode Convert Sorted Array to Binary Search TreeLeetCode
- Leetcode Convert Sorted List to Binary Search TreeLeetCode
- 【leetcode】 Unique Binary Search Trees II (middle)☆LeetCode
- [leetcode]convert-sorted-array-to-binary-search-treeLeetCode
- [LeetCode] 501. Find Mode in Binary Search TreeLeetCode
- LeetCode 1305 All Elements in Two Binary Search TreesLeetCode
- LeetCode 501. Find Mode in Binary Search TreeLeetCode
- Convert Sorted List to Binary Search Tree leetcode javaLeetCodeJava
- Convert Sorted Array to Binary Search Tree leetcode javaLeetCodeJava
- LintCode-Search Range in Binary Search Tree
- Java for LeetCode 109 Convert Sorted List to Binary Search TreeJavaLeetCode
- [LeetCode] 109. Convert Sorted List to Binary Search TreeLeetCode
- 【Leetcode】109. Convert Sorted List to Binary Search TreeLeetCode
- LeetCode Binary Search Summary 二分搜尋法小結LeetCode
- 173. Binary Search Tree Iterator
- Random和Math.random()簡單總結random
- 501-Find Mode in Binary Search Tree
- Leetcode Word SearchLeetCode
- Leetcode Search for a RangeLeetCode
- LeetCode解題報告 108. Convert Sorted Array to Binary Search Tree [medium]LeetCode