6.每日LeetCode-数组类,找到所有数组中消失的数字(Go)

作者 : admin 本文共1205个字,预计阅读时间需要4分钟 发布时间: 2024-06-17 共1人阅读

题目

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))
}

6.每日LeetCode-数组类,找到所有数组中消失的数字(Go)插图

本站无任何商业行为
个人在线分享 » 6.每日LeetCode-数组类,找到所有数组中消失的数字(Go)
E-->