Java实现 LeetCode 441 排列硬币
2023-09-14 08:58:05 时间
441. 排列硬币
你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。
给定一个数字 n,找出可形成完整阶梯行的总行数。
n 是一个非负整数,并且在32位有符号整型的范围内。
示例 1:
n = 5
硬币可排列成以下几行:
¤
¤ ¤
¤ ¤
因为第三行不完整,所以返回2.
示例 2:
n = 8
硬币可排列成以下几行:
¤
¤ ¤
¤ ¤ ¤
¤ ¤
因为第四行不完整,所以返回3.
PS:
根据数学公式,k(k+1) /2 = n,可以得到其正数解为:k = sqrt(2n+1/4) - 1/2。然后求整即可。
唯一的问题是,这里2n+1/4有可能会超出sqrt函数的参数范围。
于是,我们可以变换一下, k = sqrt(2) * sqrt(n+1/8) - 1/2,这样求平方根就不会超限了。
于是,我们就有了这么一行代码
class Solution {
public int arrangeCoins(int n) {
return (int) (-1 + Math.sqrt(1 + 8 * (long) n)) / 2;
}
}
相关文章
- Java实现 LeetCode 803 打砖块 (DFS)
- Java实现 LeetCode 785 判断二分图(分析题)
- Java实现 LeetCode 761 特殊的二进制序列(括号问题)
- Java实现 LeetCode 715 Range 模块(选范围)
- Java实现 LeetCode 701 二叉搜索树中的插入操作(遍历树)
- Java实现 LeetCode 670 最大交换(暴力)
- Java实现 LeetCode 564 寻找最近的回文数(今天要GG在这道题了 头晕+题难(((φ(◎ロ◎;)φ))))...
- Java实现 LeetCode 524 通过删除字母匹配到字典里最长单词(又是一道语文题)
- Java实现 LeetCode 518 零钱兑换 II
- Java实现 LeetCode 472 连接词
- Java实现 LeetCode 373 查找和最小的K对数字
- Java实现 LeetCode 299 猜数字游戏
- Java实现 LeetCode 109 有序链表转换二叉搜索树
- Java实现 LeetCode 94 二叉树的中序遍历
- Java实现 LeetCode 88 合并两个有序数组
- Java实现 LeetCode 72 编辑距离
- Java实现 LeetCode 71 简化路径
- Java实现 LeetCode 62 不同路径
- Java实现 LeetCode 50 Pow(x,n)
- Java实现 LeetCode 14 最长公共前缀
- Java实现 LeetCode 5 最长回文子串
- Java实现LeetCode #986 - Interval List Intersections
- 【java】Java并发编程--Java实现多线程的4种方式