[LeetCode]441. 排列硬币

每天一道编程题

  • 题目描述
  • 样例
  • python解法
  • C++语言解法

题目描述

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

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

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

样例

[LeetCode]441. 排列硬币_第1张图片

python解法

class Solution:
    def arrangeCoins(self, n: int) -> int:
        import math
        return math.floor( math.sqrt(1/4+2*n)-1/2 )
        # import math
        # x = (int)(math.sqrt(n))
        # for i in range(x, x+100000):
        #     y = i//2*(i+1)if i % 2 == 0 else (i+1)//2*i
        #     if y == n:
        #         return i
        #     elif y > n:
        #         return i-1
        # return 0

执行用时 : 36ms
内存消耗 : 14MB

题后反思:

  1. 这个时候就看出数学的用处了,一句话就可以代替注释中的全部内容
  2. 参考
  3. i = − b + b 2 − 4 a c 2 a i=\frac{-b+\sqrt{b^2-4ac}}{2a} i=2ab+b24ac 时,此时取到的是令d=0的右值,因为d>=0,二次函数是一个开口向上的,所以必须向下取整数。
  4. 用到了许多二次函数的性质,还有零点定理等。

C++语言解法

#include
class Solution {
public:
    int arrangeCoins(int n) {
        long x = n;
        return floor(sqrt(1.0/4+2*x)-1.0/2);
    }
};

执行用时 : 4ms
内存消耗 : 8.3MB

题后反思:无

文中都是我个人的理解,如有错误的地方欢迎下方评论告诉我,我及时更正,大家共同进步

你可能感兴趣的:(LeetCode)