算法之美

本文探讨了Leetcode第441题Arrangecoins的不同解法,从O(n)的朴素方法逐步优化至O(1)的时间复杂度。通过对比三种算法(逐层累加、二分查找和直接计算公式),展示了算法优化的魅力。

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

算法之美

标签(空格分隔): Leetcode 算法 时间复杂度


  过完年刚回实验室,回归状态之余,随便在Leetcode上选了道简单的算法题目,accept虽然容易,但是如果考虑到时间复杂度的话,还是值得小酌一二,在这里与诸君分享。
  题目选自Leetcode第441题, Arrange coins。题目概述如下,给你n枚硬币,你要堆积起k层,使得每一层的硬币数量为k枚,给出的例子如下:
Example 1:
*n = 5
The coins can form the following rows:
¤
¤ ¤
¤ ¤
Because the 3rd row is incomplete, we return 2.*

Example 2:
*n = 8
The coins can form the following rows:
¤
¤ ¤
¤ ¤ ¤
¤ ¤
Because the 4th row is incomplete, we return 3.*
  咋看之下,一般人都能想到很直白的解决方案,那就是从第一层开始逐层累加,并判断当前层是否满足要求,硬币是否用尽,代码如下:

class Solution(object):  
    def arrangeCoins(self, n):  
        """ 
        :type n: int 
        :rtype: int 
        """  
        # This is a stupid solution  
        k = 0  
        total = 0  
        while n - total > k:  
            k += 1  
            total += k  
        return k   

一直需要累加到1+2++k+k+1>n1+2+⋯+k+k+1>n,返回的k值即为所求。显然可知该朴素方法(Naive Algorithm)的算法时间复杂度为O(n)O(n)
  那么有没有一种更快的方法呢?答案是有的,我们可以使用二分法来加快搜索 k 的过程,每一次取中间值 mid 来判断,当 1+2++mid<=n1+2+⋯+mid<=n1+2++mid+(mid+1)>n1+2+⋯+mid+(mid+1)>n时,我们的 mid 即为所求层数 k ,代码如下所示:

class Solution(object):
    def arrangeCoins(self, n):
        """
        :type n: int
        :rtype: int
        """
        # The solution is faster than the original one, but, can we make it faster? absolutely we can

        def helper(low, high, n):
            if low > high:
                return 0
            mid = (low + high) / 2
            if (1 + mid) * mid / 2 <=n and (2 + mid) * (1 + mid) / 2 > n:
                return mid
            elif (2 + mid) * (1 + mid) / 2 <= n:
                return helper(mid, high, n)
            else:

                return helper(low, mid, n)
        return helper(1,n,n)

显然该方法的时间复杂度为O(log(n))O(log(n)),相比于前面的朴素算法,这算是个不错的解法,那么,还能不能更快一些?
  这时候,数学的魅力就展现出来了。1+2++k<=n1+2+⋯+k<=n,求和之后的表达式是一个一元二次不等式k2+k2n<=0k2+k−2n<=0,显然在等号处可以取最大k值,因此可直接解出k=1+8n12k=−1+8n−12(k 为正),代码只有一行,时间复杂度为O(1)O(1):

return ((8*n-1)**0.5-1)/2

  一叶知秋,同样的问题,不同的解法,差异之大,令人咋舌。这也正是算法吸引人的魅力所在。随着人工智能热潮的席卷,很多问题都可以靠AI来解决,但是真正能取得突破性进展,仍然依赖于人类开发的算法的优劣好坏。这也算是刷题过程中的一点小小的感悟吧,与君共勉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值