3.【448】找到所有数组中消失的数字
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]
示例 2:
输入:nums = [1,1]
输出:[2]
题目更高阶的要求不使用额外的空间。这增加了难度。
真正求解本题需要用到一个奇技淫巧:原地修改数组。
这个思想来自于长度为 N 的数组可以用来统计 1N 各数字出现的次数;题目给出的数组的长度正好为 N,所以可以原地修改数组实现计数。
当前元素是nums[i],那么我们把第nums[i]-1的位置元素✖️负1,用来标记该位置出现过,这里说的是下标是nums[i]-1。当然如果nums[i]-1下标所对应的元素已经是负数了,那么就是说nums[i]已经出现过了,就不用再把下标为nums[i]-1的元素✖️负1了。
最后再次遍历nums数组,如果该数组中的元素有为正数的,也就是说如果i位置的元素是正数的,则说明i没有出现过,所以返回+1就可以。
func findDisappearedNumbers(nums []int) []int {
for _, v := range nums {
if nums[abs(v)-1] > 0 {
nums[abs(v)-1] *= -1
}
}
res := []int{}
//遍历nums,看看里面那个没有被标记为负数的,就把它的下标+1就是缺的数字啊
for i:=0;i<len(nums);i++{
if nums[i] > 0 {
res = append(res, i+1)
}
}
return res
}
func abs(a int) int {
if a < 0 {
return -a
}
return a
}