当前位置: 首页 > 后端技术 > Java

LeetCode-441-ArrangeCoins

时间:2023-04-01 18:46:41 Java

ArrangeCoins题目描述:你一共有n个硬币,你需要将它们排成阶梯状,并且第k行恰好有k个硬币。给定一个数字n,找出构成完整阶梯行的总行数。n为32位有符号整数范围内的非负整数。例子见LeetCode官网。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode所有。商业转载请联系官方授权,非商业转载请注明出处。方案一:穷举法简单累加,直到大于n,最后返回对应的层数。这种方法效率太低,当n很大时会超时。解法二:二分查找法首先,上下限low和high分别为最大和最小层数,根据n=x*(x+1)/2估计最大值,然后使用二分查找法求出第二层最多可以放几层,最后返回层数。publicclassLeetCode_441{/***穷举法,n太大时会超时,效率不高**@paramn*@return*/publicstaticintarrangeCoins(intn){intsum=0,行数=0;for(inti=1;;i++){if(sum+i>n){中断;}总和+=我;行++;}返回行;}/***二分查找法**@paramn*@return*/publicstaticintarrangeCoins2(intn){//low和high分别是最大和最小层数,最大值根据`n估计=x*(x+1)/2`intlow=1,high=(int)Math.sqrt(Double.valueOf(Integer.MAX_VALUE)*2),mid=-1;//使用二分查找法找到可以放置的最大层级while(low<=high){mid=(low+high)/2;双温度=(双)中*(中+1)/2;如果(温度>n){高=中-1;}elseif(tempn){返回中间-1;}else{返回中间;}}publicstaticvoidmain(String[]args){//测试测试用例1,预期输出:2System.out.println(arrangeCoins2(5));//测试用例2,预期输出:3System.out.println(arrangeCoins2(8));//测试用例3,预期输出:65535System.out.println(arrangeCoins2(2147483647));//测试用例3,预期输出:60070System.out.println(arrangeCoins2(1804289383));}}【每日留言】如果一切都等到明天再做,机会会更好的擦肩而过