时间复杂度:O(n),空间复杂度:O(1)
解题思路
常规思路是首先确定数组的长度,也就是n。然后创建长度为n的哈希表,记录所有值的出现情况,最后将未出现的值放到res数组中。
但如果这样做就不符合题目要求的空间复杂度为O(1),所以我们要考虑如何用原数组充当哈希表记录值的出现情况。
仔细一想,哈希表的长度为n,原数组的长度也为n,并且所有值都是1~n,那我们不就可以修改值不是1~n来记录该下标已经出现嘛。我们可以按照官方题解的方法让元素值加n,也可以将元素值修改为负数,总之不要让值为1~n就ok,这样遍历完一遍数组后我们就记录下所有值的出现情况,接下来再遍历一遍数组,让所有还是1~n的元素值放到res数组中,返回结果。
AC代码
func findDisappearedNumbers(nums []int) (res []int) {
n:=len(nums)
for _,num:=range nums{
num=(num-1)%n//注意下标是从0开始
nums[num]+=n
}
for i,num:=range nums{
//下标为i的值不大于n,说明i+1未出现
if num<=n{
res=append(res,i+1)
}
}
return res
}
感悟
只想到哈希表的做法,但实在想不出来如何让空间复杂度降为O(1)。看了题解后恍然大悟,原来还可以这样做?未来在做题时也可以考虑如何通过本地修改原数组来实现O(1)的空间复杂度。