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]
    

执行结果如下:


左神java代码

以上是关于2021-12-19:找到所有数组中消失的数字。 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums(的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode448-找到所有数组中消失的数字(原地数组)

《LeetCode之每日一题》:84.找到所有数组中消失的数字

题目地址(448. 找到所有数组中消失的数字)

找到所有数组中消失的数字

找到数组中所有消失的数字

278找到所有数组中消失的数字