题目描述
https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array/
思路题解
方法一:
python代码
class Solution:
def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
i=0
#1. 遍历数组元素,对应的索引位置的元素作标记
while i<len(nums):
#由于数组的元素有可能已被*-1,所以取绝对值
if abs(nums[i])-1<len(nums) and nums[abs(nums[i])-1]>0:
nums[abs(nums[i])-1]*=-1
i+=1
i-=1
#2. 寻找没有标记的索引位置
while i>=0:
if nums[i]<0:
del nums[i]
else:
nums[i]=i+1
i-=1
return nums
go代码
func abs(x int)int{
if x<0{
return -x
}
return x
}
func findDisappearedNumbers(nums []int) []int {
i:=0
for ;i<len(nums);i++{
if abs(nums[i])-1<len(nums) && nums[abs(nums[i])-1]>0{
nums[abs(nums[i])-1]*=-1
}
}
i--
for i>=0{
if nums[i]<0{
nums=append(nums[:i],nums[i+1:]...)
}else{
nums[i]=i+1
}
i-=1
}
return nums
}
方法二:
先遍历数组,当目前的元素不正确时,判断正确位置的那个元素是否是正确的,如果不正确,则与正确位置的那个元素交换,继续判断交换后的i
位置的元素是否正确;如果正确,则退出循环,并i+1
。
最后原地去除正确的元素,原地修改不正确的元素,返回nums
数组。
python代码
class Solution:
def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
i=0
while i <len(nums):
while nums[i]!=i+1:#当目前的元素不正确时
#判断正确位置的元素nums[nums[i]-1]是否已经正确
if nums[i]-1<len(nums) and nums[i]!=nums[nums[i]-1]:
#交换
nums[nums[i]-1],nums[i]=nums[i],nums[nums[i]-1]
else:
break
i+=1
i=len(nums)-1
#原地去除正确的元素,原地修改不正确的元素
while i>=0:
if nums[i]==i+1:
del nums[i]
else:
nums[i]=i+1
i-=1
return nums