LeetCode:441. Arranging Coins

本文详细解析了LeetCode上的第441题“排币问题”,介绍了三种不同的解决方法:直接模拟法、数学公式法及二分查找法,并通过示例验证了各方法的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1 package day20170206;
 2 //LeetCode:441. Arranging Coins
 3 /*
 4  You have a total of n coins that you want to form in a staircase shape, where every k-th row must have exactly k coins.
 5 Given n, find the total number of full staircase rows that can be formed.
 6 
 7 n is a non-negative integer and fits within the range of a 32-bit signed integer.
 8 
 9 Example 1:
10 
11 n = 5
12 
13 The coins can form the following rows:
14 ¤
15 ¤ ¤
16 ¤ ¤
17 
18 Because the 3rd row is incomplete, we return 2.
19 Example 2:
20 
21 n = 8
22 
23 The coins can form the following rows:
24 ¤
25 ¤ ¤
26 ¤ ¤ ¤
27 ¤ ¤
28 
29 Because the 4th row is incomplete, we return 3.
30 Subscribe to see which companies asked this question.
31  */
32 public class arrangeCoins441 {
33     public static int arrangeCoins(int n) {
34         int i=1;
35         for(;n>=i;i++){
36             n=n-i;
37         }
38         return i-1;
39     }
40     //study (k+1)k<=2n--> 4k^2+4k+1<=8n+1--> (2k+1)^2<=8n+1
41     public static int arrangeCoins2(int n){
42         return (int)((Math.sqrt(8.0*n+1)-1)/2);
43     }
44     //study left right   mid*mid是一个很大的数,0.5要放在前面  left=0和left=1无差
45     public static int arrangeCoins3(int n){
46         int left=1,right=n;
47         int mid=0;
48         while(left<=right){
49             mid=(left+right)/2;
50             if(0.5*mid*(mid+1)>n)
51                 right=mid-1;
52             else
53                 left=mid+1;
54         }
55         return left-1;
56     }
57     public static void main(String[] args) {
58         // TODO Auto-generated method stub
59 
60         System.out.println(arrangeCoins(1));
61         System.out.println(arrangeCoins(3));
62         System.out.println(arrangeCoins(4));
63         System.out.println(arrangeCoins(5));
64         System.out.println(arrangeCoins(6));
65         System.out.println(arrangeCoins(7));
66         System.out.println(arrangeCoins(8));
67         System.out.println(arrangeCoins(1804289383));
68         
69         System.out.println(arrangeCoins2(1));
70         System.out.println(arrangeCoins2(3));
71         System.out.println(arrangeCoins2(4));
72         System.out.println(arrangeCoins2(5));
73         System.out.println(arrangeCoins2(6));
74         System.out.println(arrangeCoins2(7));
75         System.out.println(arrangeCoins2(8));
76         System.out.println(arrangeCoins2(1804289383));
77         
78         System.out.println(arrangeCoins3(1));
79         System.out.println(arrangeCoins3(3));
80         System.out.println(arrangeCoins3(4));
81         System.out.println(arrangeCoins3(5));
82         System.out.println(arrangeCoins3(6));
83         System.out.println(arrangeCoins3(7));
84         System.out.println(arrangeCoins3(8));
85 
86         System.out.println(arrangeCoins3(1804289383));
87     }
88 
89 }

 

转载于:https://www.cnblogs.com/luluqiao/p/6372767.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值