查找范围 [1, N] 中不存在于给定数组中的所有数字
给定一个大小为N的数组arr[] ,其中arr[i]是 小于或等于N的自然数,任务是找到范围[1, N]中不存在于给定数组中的所有数字。
例子:
Input: arr[ ] = {5, 5, 4, 4, 2}
Output: 1 3
Explanation:
For all numbers in the range [1, 5], 1 and 3 are not present in the array.
Input: arr[ ] = {3, 2, 3, 1}
Output: 4
朴素方法:最简单的方法是使用任何数据结构(如字典)对每个数组元素进行散列,然后遍历范围[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)