📌  相关文章
📜  查找范围 [1, N] 中不存在于给定数组中的所有数字

📅  最后修改于: 2022-05-13 01:56:05.729000             🧑  作者: Mango

查找范围 [1, N] 中不存在于给定数组中的所有数字

给定一个大小为N的数组arr[] ,其中arr[i] 小于或等于N的自然数,任务是找到范围[1, N]中不存在于给定数组中的所有数字。

例子:

朴素方法:最简单的方法是使用任何数据结构(如字典)对每个数组元素进行散列,然后遍历范围[1, N]并打印散列中不存在的所有数字。

d

时间复杂度: O(N)
辅助空间: O(N)

方法:上述方法可以通过标记位置arr[i] – 1 处的数字来进一步优化,负数以标记i存在于数组中。然后打印缺少的数组元素的所有位置。请按照以下步骤解决问题:

  • 遍历数组 arr[] 并对每个当前元素num执行以下步骤:
    • arr[abs(num)-1]更新为-abs(arr[abs(num)-1])。
  • 使用变量i遍历数组arr[] ,如果arr[i]为正,则打印i+1

下面是上述方法的实现:

C++
// C++ program for above approach
#include 
using namespace std;
 
// Function to find the missing numbers
void getMissingNumbers(int arr[], int N)
{
    // traverse the array arr[]
    for (int i = 0; i < N; i++) {
        // Update
        arr[abs(arr[i]) - 1] = -(abs(arr[abs(arr[i]) - 1]));
    }
    // Traverse the array arr[]
    for (int i = 0; i < N; i++) {
        // If Num is not present
        if (arr[i] > 0)
            cout << i + 1 << " ";
    }
}
 
// Driver Code
int main()
{
 
    // Given Input
    int N = 5;
    int arr[] = { 5, 5, 4, 4, 2 };
 
    // Function Call
    getMissingNumbers(arr, N);
    return 0;
}
// This codeis contributed by dwivediyash


Java
// Java program for the above approach
import java.io.*;
 
class GFG
{
   
    // Function to find the missing numbers
    static void getMissingNumbers(int arr[], int N)
    {
       
        // traverse the array arr[]
        for (int i = 0; i < N; i++)
        {
           
            // Update
            arr[Math.abs(arr[i]) - 1]
                = -(Math.abs(arr[Math.abs(arr[i]) - 1]));
        }
       
        // Traverse the array arr[]
        for (int i = 0; i < N; i++)
        {
           
            // If Num is not present
            if (arr[i] > 0)
                System.out.print(i + 1 + " ");
        }
    }
 
    // Driver Code
    public static void main(String[] args)
    {
       
        // Given Input
        int N = 5;
        int arr[] = { 5, 5, 4, 4, 2 };
 
        // Function Call
        getMissingNumbers(arr, N);
    }
}
 
// This code is contributed by Potta Lokesh


Python3
# Python program for the above approach
 
# Function to find the missing numbers
def getMissingNumbers(arr):
 
    # Traverse the array arr[]
    for num in arr:
 
        # Update
        arr[abs(num)-1] = -(abs(arr[abs(num)-1]))
 
    # Traverse the array arr[]
    for pos, num in enumerate(arr):
 
        # If Num is not present
        if num > 0:
            print(pos + 1, end =' ')
 
 
# Given Input
arr = [5, 5, 4, 4, 2]
 
# Function Call
getMissingNumbers(arr)


C#
// C# program for above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
// Function to find the missing numbers
static void getMissingNumbers(int []arr, int N)
{
   
    // traverse the array arr[]
    for (int i = 0; i < N; i++)
    {
       
        // Update
        arr[Math.Abs(arr[i]) - 1] = -(Math.Abs(arr[Math.Abs(arr[i]) - 1]));
    }
   
    // Traverse the array arr[]
    for (int i = 0; i < N; i++)
    {
       
        // If Num is not present
        if (arr[i] > 0)
          Console.Write(i + 1 + " ");
    }
}
 
// Driver Code
public static void Main()
{
 
    // Given Input
    int N = 5;
    int []arr = { 5, 5, 4, 4, 2 };
 
    // Function Call
    getMissingNumbers(arr, N);
}
}
 
// This code is contributed by ipg2016107.


Javascript


输出
1 3 

时间复杂度: O(N)
辅助空间: O(1)