classSolution:deffindDisappearedNumbers(self, nums: List[int])-> List[int]:
n =len(nums)for num in nums:
x =(num -1)% n
nums[x]+= n
return[i +1for i, num inenumerate(nums)if num <= n]### 0206 找规律(404 ms,22.8 MB)deffindDisappearedNumbers(self, nums: List[int])-> List[int]:
res =[]# 第一次遍历:根据数组的值找到对应的下标for num in nums:# 注意:因为值有可能已经取反,所以需要使用绝对值来确定下标!
idx =abs(num)-1# 原地改变数组:题目限定不使用额外空间# 把值为正的数取相反数if nums[idx]>0:
nums[idx]*=-1# 第二次遍历:在修改后的数组中,找出值为正的数,其下标加一则是缺少的值# 未出现的值,其对应的下标所指向的元素都是正数for idx inrange(len(nums)):if nums[idx]>0:
res.append(idx +1)return res
classSolution:# 哈希表deffirstMissingPositive(self, nums: List[int])->int:
n =len(nums)# 把不属于[1,n]的值全部修改为n+1for i inrange(n):if nums[i]<=0:
nums[i]= n +1# 把属于[1,n]的值全部取相反数for i inrange(n):
num =abs(nums[i])if num <= n:
nums[num -1]=-abs(nums[num -1])# 修改完成后,数组中第一个大于0的值,所在位置即为第一个缺失的正数for i inrange(n):if nums[i]>0:return i +1return n +1
classSolution:# 置换deffirstMissingPositive(self, nums: List[int])->int:
n =len(nums)for i inrange(n):# 若当前遍历的数x在[1,n]之间,那么它的正确位置(下标)应该是x-1# 则直接交换nums[i]与nums[x-1],把x换到正确的位置上# 交换完后新得到的nums[i]还可能在[1,n]之间,则继续把它换到正确位置上# 直到x不在[1,n]之间while1<= nums[i]<= n and nums[nums[i]-1]!= nums[i]:
nums[nums[i]-1], nums[i]= nums[i], nums[nums[i]-1]for i inrange(n):# 恢复后,第i个数的值应该是i+1if nums[i]!= i +1:return i +1return n +1
classSolution:defmissingElement(self, nums: List[int], k:int)->int:
n =len(nums)if n ==1:return nums[0]+ k
left, right =0, n
while left < right:
mid =(left + right)//2if nums[mid]< nums[0]+ mid + k:
left = mid +1else:
right = mid
return nums[0]+ left + k -1
classSolution:deffindDuplicates(self, nums: List[int])-> List[int]:
res =[]for i inrange(len(nums)):
loc =abs(nums[i])-1# 以每个值的绝对值作为下标# 若以下标指向的值已经为,则表示第二次出现,即重复if nums[loc]<0:
res.append(loc +1)# 加入此重复出现的值
nums[loc]=-nums[loc]# 下标值取反进行标记return res