python的一个小陷阱

调用函数,函数的形参的改变会连着改变实参。

代码:

def smallestDivisor(nums: list[int], threshold: int) -> int:
    def divisor(array, d, t):
        for i in range(0, len(array)):
            if array[i] % d == 0:
                array[i] = array[i] // d
            else:
                array[i] = array[i] // d + 1
        return True if sum(array) <= t else False

    l, r = 1, threshold
    while l < r:
        mid = (r - l >> 1) + l
        if divisor(nums, mid, threshold):
            r = mid
        else:
            l = mid + 1
    return r

当调用smallestDivisor的内嵌函数divisor时,我们传入的形参array的改变会连带着主函数的nums的元素改变。

今天写算法题的时候算是小小的掉进陷阱了,然后我就就另外创建了一个数组进行储存解决了这个问题。

其实还有一种方法可以不用额外创建数组,就是直接使用列表生成器,我们调用这个函数其实是想要求得array数组中每个元素与除数d相除并向上取整后的数组的和。

那么直接    sum((x - 1) // mid + 1 for x in nums)  可以极大的提升我们算法的速度,因为python自身的列表生成器比我们手写的运行速度要快3倍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值