欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

441. 排列硬币

程序员文章站 2024-03-16 08:35:04
...

你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。

给定一个数字 n,找出可形成完整阶梯行的总行数。

n 是一个非负整数,并且在32位有符号整型的范围内。

示例 1:

n = 5

硬币可排列成以下几行:
¤
¤ ¤
¤ ¤

因为第三行不完整,所以返回2.
示例 2:

n = 8

硬币可排列成以下几行:
¤
¤ ¤
¤ ¤ ¤
¤ ¤

因为第四行不完整,所以返回3.

题目分析:
该题看似很简单的逻辑方程,但在写代码的过程中发现自己所写的代码存在一些平时很少考虑到的问题,如int溢出问题时间超出限制等问题,这些问题是值得思考的问题,关乎到设计的算法的高效性问题!!!
列举一下自己的错误代码和出错情况。
第一种:解答错误,存在极大值不能求出正确结果的问题!!!

class Solution {
    public int arrangeCoins(int n) {
        //通过累加进行判断是否超过所给硬币数
        int i = 1;
        int sum = 0;
        for(i=1;sum<n;i++){
            sum = sum + i;
            
        }
        if(sum==n)
            return i-1;
        else
            return i-2;
        
    }
}

第二种:存在时间超过限制

class Solution {
    public int arrangeCoins(int n) {
        //通过累加进行判断是否超过所给硬币数
        int i = 0;
        int sum = 0;
        while(sum<=n){
            i += 1;
            sum += i;
            
        }
        
        return i-1;
        
    }
}

第三种:超出时间限制

 //另一种求解方法
        int i = 0;
        int sum = 0;
        while(true){
            sum = sum + i + 1;
            if(sum > n){
                break;
            }
            i++;
        }
        return i;

没能得出一种兼顾时间和空间的算法,希望有大佬可以指点一下,谢谢!