2021-12-19:找到所有数组中消失的数字。 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums(
Posted 福大大架构师每日一题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-12-19:找到所有数组中消失的数字。 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums(相关的知识,希望对你有一定的参考价值。
2021-12-19:找到所有数组中消失的数字。
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。
力扣448。
答案2021-12-19:
下标循环怼。争取i位置放i+1。
时间复杂度:O(N)。
额外空间复杂度:O(1)。
代码用golang编写。代码如下:
package main
import "fmt"
func main()
nums := []int4, 3, 2, 7, 8, 2, 3, 1
ret := findDisappearedNumbers(nums)
fmt.Println(ret)
func findDisappearedNumbers(nums []int) []int
ans := make([]int, 0)
if len(nums) == 0
return ans
N := len(nums)
for i := 0; i < N; i++
// 从i位置出发,去玩下标循环怼
walk(nums, i)
for i := 0; i < N; i++
if nums[i] != i+1
ans = append(ans, i+1)
return ans
func walk(nums []int, i int)
for nums[i] != i+1 // 不断从i发货
nexti := nums[i] - 1
if nums[nexti] == nexti+1
break
nums[i], nums[nexti] = nums[nexti], nums[i]
执行结果如下:
以上是关于2021-12-19:找到所有数组中消失的数字。 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums(的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode448-找到所有数组中消失的数字(原地数组)