441 排列硬币(难度:简单)
答案一:当时下意识反应想到的答案
很简单,直接循环每次需要的硬币数,一直到硬币不够为止,快三个月没写过代码,好陌生的感觉 :( 。
class Solution {
public:
int arrangeCoins(int n) {
int i=1;
for(int n_temp = n; n_temp>=i; i++){
n_temp -= i;
}
return i-1;
}
};
?答案二:数列规律
随着硬币行数上涨,硬币总数应该为 1,3,6,10,15....,即 ?,发现之后就去复习高中数学找规律了,规律为i(i+1)/2,忽略了较大数据下int内存不够,导致错误。后面改得时候类型转换又是一顿错,啥都忘了,枯了。
class Solution {
public:
int arrangeCoins(int n) {
long i;
long j;
for(i=1,j=0;j<=(long)n;i++){
j = i*(i+1)/2;
}
return (int)i-2;
}
};
?答案三:数学求解方程,题解区找到的答案
即解方程 x(x+1)/2 = n 的解,舍弃负数解,最终结果为,结果向下取整。C++怎么开根号临时百度了。没注意int内存不够的问题,又被报了两次错。
class Solution {
public:
int arrangeCoins(int n) {
int i = (sqrt(8*(long)n+1)-1)/2;
return i;
}
};
?答案四:二分查找(这熟悉又陌生的算法名字)
有n个硬币的情况下,最少1行,最多n行(n==1)时。(在评论区找到了用移位代替除2,我怎么就全忘了呢)
class Solution {
public:
int arrangeCoins(int n) {
long left = 1;
long right = n;
long mid;
while( right-left>1 ){
mid = (left+right)>>1;
if((mid*(mid+1))/2 == (long)n)
return (int)mid;
else if((mid*(mid+1))/2 < (long)n)
left = mid;
else
right = mid;
}
return (right * (right + 1) == (long) 2 * n) ? (int) right : (int) left;
}
};
?一道题做了好久,感觉这个打卡坚持不了几天了,随缘吧,不强求。
|