前言
今天我真的超级开心,嘿嘿,昨天发了一篇博文,在今天做leetCode题的时候,有人突然给我说,pier,你的博客上Java领域榜第三名了,我靠,牛啊。当时我其实不太信的,我就去看了一下,再仔细翻了一下,居然还上了全站综合热榜的第28名。再提一下,昨天没更新的原因是,我的题没有通过,失败了,也就没有打卡到,也没做出来。
打卡界面
原题题目
你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。
给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。
原题案例
解法分析
方法一:直接比较法
我们通过求和的形式,比较两个数的大小,当我们的和大于我们的数n时,就可以将我们的数提出来了,如果没有大于它呢,就继续往下加,每一次加数的时候,就给我们的阶梯加1,最后返回阶梯数就好了。
方法一代码展示
public int arrangeCoins(int n) {
int index=0;
//这里将数组长度写成long是因为数据会超出长度
long sum=0;
long n1 = n;
for (int i = 1; i <= n ; i++) {
sum+=i;
if(sum>n){
break;
}
index++;
}
return index;
}
}
方法一leetcode运行截图
方法二:数学计算法
我们看一眼解题,他其实和我们求前n个数的和,就好像时我们1+2+3,就一直加到哪一个数会大于n就可以了。那么我们假设这个数为sum,有x个数,那么:
KaTeX parse error: Can't use function '$' in math mode at position 8: sum = X$̲\times$(X+1)/2
按照题意来说,我们只需要求出来,当sum<n时X的最大值,即
n
>
X
×
(
X
+
1
)
/
2
n>X×(X+1)/2
n>X×(X+1)/2时X能取得最大值,我们将它用数学得方式来求就是,当
(
X
×
(
X
+
1
)
/
2
)
−
n
>
0
(X×(X+1)/2)-n>0
(X×(X+1)/2)−n>0,那么这个我们怎么求呢,我们可以展开一下,即
X
2
+
X
−
2
n
>
0
X^2 + X -2n>0
X2+X−2n>0,这一个因为n时常数,而二次方得系数为1>0,所以我们就可以用n求出来这个X了。
我
们
令
X
2
−
X
−
2
n
=
0
我们令X^2 -X -2n=0
我们令X2−X−2n=0
因为n>=1,所以
Δ
=
b
2
−
4
a
c
=
8
n
+
1
>
0
Δ=b^2−4ac=8n+1>0
Δ=b2−4ac=8n+1>0
根据公式我们可以推得:
x
1
=
(
−
1
−
(
8
n
+
1
)
)
/
2
,
x
2
=
(
−
1
+
(
8
n
+
1
)
)
/
2
x1= (−1− \sqrt(8n+1))/2,x 2 =(−1+\sqrt (8n+1))/2
x1=(−1−(8n+1))/2,x2=(−1+(8n+1))/2
所以我们舍去x1<0,不可能存在这样得阶梯,提出来x2,写成代码就可了。
方法二代码展示
public int arrangeCoins(int n) {
return (int) ((Math.sqrt((long) 8 * n + 1) - 1) / 2);
}
方法二leetCode运行截图
Ps:每日一句毒鸡汤:这孩子不是笨,是没有找对学习方法。嗯……或许叭,学习方法都找不到,不是笨是什么呀!