这是数组的第16篇算法,力扣链接。
给你一个含
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]
根据之前的思路,先做一个交换位置的,如果发现货不对板的反推出num的值放入结果集。
func findDisappearedNumbers(nums []int) []int {
result := make([]int, 0)
for i := range nums {
for nums[i] != nums[nums[i]-1] {
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
}
}
for i, num := range nums {
if num-1 != i {
result = append(result, i+1)
}
}
return result
}
这里还有一个原地换位置的方法,其逻辑就类似于加上固定的数,使value越界,来判断是否改变,逻辑都差不多。
func findDisappearedNumbers(nums []int) []int {
result := make([]int, 0)
for _, num := range nums {
num = (num - 1) % len(nums)
nums[num] += len(nums)
}
for i, num := range nums {
if num <= len(nums) {
result = append(result, i+1)
}
}
return result
}