LeetCode 算法 | 如何排列硬币?

简介: LeetCode 算法 | 如何排列硬币?

我给大家分享 LeetCode 算法题,主要都是挑选那些很可能在面试中出现的题,或者可能出现类似的题,多看看这些题至少能够在面试中不那么被动。


今天给大家分享的 LeetCode 算法题和硬币相关:如何排列硬币,一起来看一看。


题目

你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。给定一个数字 n,找出可形成完整阶梯行的总行数。n 是一个非负整数,并且在32位有符号整型的范围。


示例1

n = 5
硬币可排列成以下几行:
¤
¤ ¤
¤ ¤
因为第三行不完整,所以返回2.

示例2

n = 8
硬币可排列成以下几行:
¤
¤ ¤
¤ ¤ ¤
¤ ¤
因为第四行不完整,所以返回3.

题目结合示例,很好理解。这里主要给大家分享三个解题方法。


1. 直接干


为什么说直接干呢?拿到这个题,第一反应是,我从第一行开始往上加,等加到 n 的时候就结束,或者大于 n 的时候就结束即可。


这个思路没有问题,但是需要考虑一个小坑在里面,那就是数据溢出的问题,因为从 1 往上加的话,有可能最后一行加了之后,就超出整数范围了,就会变成负数,所以需要注意一下溢出问题。下面给出我的代码:


public int arrangeCoins(int n) {
   int layer = 1;
   int layerTmpt = 1;
   int result = 1;
   while(result < n) {
       layerTmpt++;
       // 说明溢出
       if (layerTmpt < 0) {
           return layer;
       }
       result += layerTmpt;
       // 说明溢出
       if (result < 0) {
           return layer;
       }
       layer++;
   }
   if(result == n) {
       return layer;
   } else {
       return layer - 1;
   }
}


2. 逆向思维


从刚刚我们分析中可知,如果从 1 开始往上加,会有可能造成数据溢出,那么我们可以反过来考虑,如果我们用 n 从 1 开始减呢?是不是就不存在溢出问题了?答案是肯定的。


public int arrangeCoins(int n) {
   int layer = 0;
   for (int i = 1; i <= n; ++i) {
       n -= i;
       if (n < 0) {
           return layer;
       } else {
           layer++;
       }
   }
   return layer;
}

这样的话,代码明显就简洁多了。如果面试官看到这种代码,肯定会更加满意。


3. 用数学公式


这种就没啥好说的了,根据题目意思,排列的硬币符合等差数列,1+2+3+...+x <= n,假设相等,先求出解,然后向下取整即可。


public int arrangeCoins(int n) {
   return (int) (Math.sqrt((long) n * 2 + 0.25) - 0.5);
}


这就很魔性了,一行代码写完了,不过这是基于数学公式来做的。


相关文章
|
2月前
|
算法 C++ 容器
Leetcode第三十一题(下一个排列)
这篇文章介绍了LeetCode第31题“下一个排列”的C++解决方案,该算法通过原地修改数组来找到下一个字典序更大的排列,如果不存在则重排为字典序最小的排列。
35 0
Leetcode第三十一题(下一个排列)
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
46 0
|
1月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
2月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
35 2
|
4月前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
82 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
4月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
58 6
|
4月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
79 2
|
4月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
54 1
|
4月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
70 1
|
4天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
111 80

热门文章

最新文章