441. 排列硬币
个人思路:模拟
class Solution {
public:
int arrangeCoins(int n) {
int i=1,sum=0;
while(sum<n){
n-=i;
if(n<0)
return i-1;
else if(0==n)
return i;
else
i++;
}
return -1;
}
};
时间复杂度 O(n)
空间复杂度 O(1)
优化思路:二分查找
第i行的硬币总数是i*(i+1)/2,那么我们二分查找i满足total小于等于n
class Solution {
public:
int arrangeCoins(int n) {
long long left=1,right=n;
while(left<=right){
long long mid=left+right>>1;
if((long long)mid*(mid+1)/2==n)
return mid;
else if((long long)mid*(mid+1)/2>n)
right=mid-1;
else
left=mid+1;
}
return (int)right;
}
};
时间复杂度 O(log n)
空间复杂度 O(1)