调用函数,函数的形参的改变会连着改变实参。
代码:
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倍。