题目
448找到所有数组中消失的数字.go
给你一个含 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 == nums.length
1 <= n <= 105
1 <= nums[i] <= n
进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。
解法
package main
import "fmt"
// 448找到所有数组中消失的数字.go
// 给你一个含 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 == nums.length
// 1 <= n <= 105
// 1 <= nums[i] <= n
// 进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。
// 使用 map 非常简单,但不满足进阶
func findDisappearedNumbers1(nums []int) []int {
slice := make([]int, 0)
mp := make(map[int]bool, len(nums))
for _, val := range nums {
mp[val] = true
}
for i := 1; i <= len(nums); i++ {
if _, ok := mp[i]; !ok {
slice = append(slice, i)
}
}
return slice
}
// 1. 范围为1到n,
// 2. 将每个数-1取模, 如果按顺序就得到该值应该在的index处, 将该index处的值+n, 那么在该范围的值都应该大于n
// 3. 此时我们找出值小于n的index, 即为缺失的数字
// 时间复杂的O(n) 空间复杂度O(1)
func findDisappearedNumbers(nums []int) []int {
var rst []int
n := len(nums)
for i := 0; i < n; i++ {
idx := (nums[i] - 1) % n
nums[idx] = nums[idx] + n
}
for i := 0; i < n; i++ {
if nums[i] <= n { // 因为n也可能缺失,所以是小于等于
rst = append(rst, i+1) // 该坐标值+1 就是该值, 因为是1到n,而坐标从0开始
}
}
return rst
}
func main() {
nums := []int{4, 3, 2, 7, 8, 2, 3, 1}
fmt.Println(findDisappearedNumbers(nums))
}