你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。
给定一个数字 n,找出可形成完整阶梯行的总行数。
n 是一个非负整数,并且在32位有符号整型的范围内。
示例 1:
n = 5 硬币可排列成以下几行: ¤ ¤ ¤ ¤ ¤ 因为第三行不完整,所以返回2.
示例 2:
n = 8 硬币可排列成以下几行: ¤ ¤ ¤ ¤ ¤ ¤ ¤ ¤ 因为第四行不完整,所以返回3.
思路:
两种方法,顺序查找法(O(n))和二分查找法(O(logn)),题目给的序列是首项为1的公差为1的等差数列,前n项求和公式为:
sum(n)=n*(n+1)/2
顺序查找法代码:
long long cal(long long c) {
return (1 + c)*c / 2;
}
int arrangeCoinsCore(int n, int start, int end) {
if (cal(end) <= n) {
return end;
}
if (cal(start) > n) {
return start - 1;
}
if (cal(start) == n) {
return start;
}
int mid = start + (end - start) / 2;
if (cal(mid) == n) {
return mid;
}
if (cal(mid) > n) {
return arrangeCoinsCore(n, start, mid - 1);
}
else {
return arrangeCoinsCore(n, mid + 1, end);
}
}
int arrangeCoins(int n) {
if (n < 0) {
return 0;
}
return arrangeCoinsCore(n, 1, n);
}
二分查找法:
int arrangeCoins(int n) {
int i=1;
while(n>=i){
n-=i;
i++;
}
return i-1;
}
你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。
给定一个数字 n,找出可形成完整阶梯行的总行数。
n 是一个非负整数,并且在32位有符号整型的范围内。
示例 1:
n = 5 硬币可排列成以下几行: ¤ ¤ ¤ ¤ ¤ 因为第三行不完整,所以返回2.
示例 2:
n = 8 硬币可排列成以下几行: ¤ ¤ ¤ ¤ ¤ ¤ ¤ ¤ 因为第四行不完整,所以返回3.