我正在解决leetcode上的一道题。 “41.第一个缺失的阳性”
对于交换,当我使用 nums[i],nums[nums[i]-1] = nums[nums[i]-1],nums[i] 时,我得到了 TLE。
但是 nums[nums[i]-1],nums[i] = nums[i],nums[nums[i]-1] 工作正常。
这不仅仅是leetcode的情况。
我试图理解其中的区别,花了 1 个小时来解决这个问题。 然后联系了 Google bard 和 Chatgpt。两人都在挣扎。
花了很多时间后,我得到了一个答案“鉴于这两个代码共享相同的逻辑和条件语句,为什么代码 1 会出现问题仍然令人费解,尤其是在您描述的无限循环场景中。”
这是我的代码:
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
i,n = 0,len(nums)
while i<n:
if nums[i]>0 and nums[i]<=n and nums[nums[i]-1]!=nums[i]:
#nums[i],nums[nums[i]-1] = nums[nums[i]-1],nums[i]
nums[nums[i]-1],nums[i] = nums[i],nums[nums[i]-1]
else:
i+=1
for i in range(n):
if nums[i]!=i+1:
return i+1
return n+1
注释掉的语句给出了 TLE ,但第二个语句工作正常。有人可以解释一下,是什么原因造成的? a,b=b,a 和 b,a=a,b 不同吗?
我也在Python IDLE中定义了该函数,在交换语句下面添加了一条打印语句,结果又陷入了无限循环。
是的,分配发生的顺序发生了变化。
第一种情况,
nums[i],nums[nums[i]-1] = nums[nums[i]-1],nums[i] = ...
首先,
nums[i]
被更新,然后,nums[num[i] -1]
被更新,所以第二个分配目标受到第一个更改的影响。
第二种情况,
nums[nums[i]-1],nums[i] = ...
首先
nums[nums[i]-1]
更新,然后nums[i]
更新。 nums[i]
内的nums[nums[i]-1]
将与第一种情况不同。