LeetCode 441. 排列硬币 Arranging Coi

作者: 1江春水 | 来源:发表于2019-08-20 16:40 被阅读24次

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

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

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

    【示例1】

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

    【示例2】

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

    【思路1】
    1、时间复杂度O(n)
    2、空间复杂度O(1)

    代码实现:

    func arrangeCoins(_ n: Int) -> Int {
        if n == 0 { return 0 }
        if n <= 2 { return 1 }
        var res = 0
        for i in 1..<n {
            if n-res < i {
                return i-1
            } else if n-res == i {
                return i
            }
            res+=i
        }
        return 0
    }
    
    func arrangeCoins(_ n: Int) -> Int {
        if n == 0 { return 0 }
        if n <= 2 { return 1 }
        var res = 0
        var num = 0
        while res <= n {
            num+=1
            res+=num
        }
        return num - 1
    }
    

    【思路2】
    1、数学方法
    2、根据等差数列之和

    代码实现:

    func arrangeCoins(_ n: Int) -> Int {//数学方法
        return Int((-1+sqrt(Double(1+8*n)))/2)
    }
    

    相关文章

      网友评论

        本文标题:LeetCode 441. 排列硬币 Arranging Coi

        本文链接:https://www.haomeiwen.com/subject/dqipsctx.html