题意
给出一个n,然后我们去1,2,3…的使用n。问做多能多少次(如果最后一次不够的话就不计入结果)
思路
算法1
满足的条件是: k(k+1)2≤n 的最大k。本来想二分一下k。然后判断。
但是,从上面那个式子我们可以知道: k(k+1)≤2n 。即我们 k≤2n−−√≤k+1 。于是我们对2n开根号并四舍五入一定能得到k或者k + 1。
最后对k或者k + 1特判一下就好。
算法2
直接根据 k(k+1)2=n 解一下方程组就好。
代码
//algorithm1
class Solution {
public:
int arrangeCoins(int n) {
long long x = sqrt(2 * (long long)n);
return (x + 1) * x / 2 <= n ? x : x - 1;
}
};
//algorithm 2
class Solution {
public:
int arrangeCoins(int n) {
return (-1 + sqrt(1 + 8 * (long long)n)) / 2;
}
};