给定一个由不同元素组成的数组arr [0..n-1]和一个范围[low,high],找到所有在范围内但不在数组中的数字。缺少的元素应按排序顺序打印。
例子:
Input: arr[] = {10, 12, 11, 15},
low = 10, hight = 15
Output: 13, 14
Input: arr[] = {1, 14, 11, 51, 15},
low = 50, hight = 55
Output: 50, 52, 53, 54
可以采用以下两种方法来解决该问题。
使用排序:对数组进行排序,然后对“低”进行二进制搜索。一旦找到低位,请从该位置开始遍历数组,并继续打印所有遗漏的数字。
C++
// A sorting based C++ program to find missing
// elements from an array
#include
using namespace std;
// Print all elements of range [low, high] that
// are not present in arr[0..n-1]
void printMissing(int arr[], int n, int low,
int high)
{
// Sort the array
sort(arr, arr + n);
// Do binary search for 'low' in sorted
// array and find index of first element
// which either equal to or greater than
// low.
int* ptr = lower_bound(arr, arr + n, low);
int index = ptr - arr;
// Start from the found index and linearly
// search every range element x after this
// index in arr[]
int i = index, x = low;
while (i < n && x <= high) {
// If x doesn't math with current element
// print it
if (arr[i] != x)
cout << x << " ";
// If x matches, move to next element in arr[]
else
i++;
// Move to next element in range [low, high]
x++;
}
// Print range elements thar are greater than the
// last element of sorted array.
while (x <= high)
cout << x++ << " ";
}
// Driver program
int main()
{
int arr[] = { 1, 3, 5, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
int low = 1, high = 10;
printMissing(arr, n, low, high);
return 0;
}
Java
// A sorting based Java program to find missing
// elements from an array
import java.util.Arrays;
public class PrintMissing {
// Print all elements of range [low, high] that
// are not present in arr[0..n-1]
static void printMissing(int ar[], int low, int high)
{
Arrays.sort(ar);
// Do binary search for 'low' in sorted
// array and find index of first element
// which either equal to or greater than
// low.
int index = ceilindex(ar, low, 0, ar.length - 1);
int x = low;
// Start from the found index and linearly
// search every range element x after this
// index in arr[]
while (index < ar.length && x <= high) {
// If x doesn't math with current element
// print it
if (ar[index] != x) {
System.out.print(x + " ");
}
// If x matches, move to next element in arr[]
else
index++;
// Move to next element in range [low, high]
x++;
}
// Print range elements thar are greater than the
// last element of sorted array.
while (x <= high) {
System.out.print(x + " ");
x++;
}
}
// Utility function to find ceil index of given element
static int ceilindex(int ar[], int val, int low, int high)
{
if (val < ar[0])
return 0;
if (val > ar[ar.length - 1])
return ar.length;
int mid = (low + high) / 2;
if (ar[mid] == val)
return mid;
if (ar[mid] < val) {
if (mid + 1 < high && ar[mid + 1] >= val)
return mid + 1;
return ceilindex(ar, val, mid + 1, high);
}
else {
if (mid - 1 >= low && ar[mid - 1] < val)
return mid;
return ceilindex(ar, val, low, mid - 1);
}
}
// Driver program to test above function
public static void main(String[] args)
{
int arr[] = { 1, 3, 5, 4 };
int low = 1, high = 10;
printMissing(arr, low, high);
}
}
// This code is contributed by Rishabh Mahrsee
Python
# Python library for binary search
from bisect import bisect_left
# A sorting based C++ program to find missing
# elements from an array
# Print all elements of range [low, high] that
# are not present in arr[0..n-1]
def printMissing(arr, n, low, high):
# Sort the array
arr.sort()
# Do binary search for 'low' in sorted
# array and find index of first element
# which either equal to or greater than
# low.
ptr = bisect_left(arr, low)
index = ptr
# Start from the found index and linearly
# search every range element x after this
# index in arr[]
i = index
x = low
while (i < n and x <= high):
# If x doesn't math with current element
# print it
if(arr[i] != x):
print(x, end =" ")
# If x matches, move to next element in arr[]
else:
i = i + 1
# Move to next element in range [low, high]
x = x + 1
# Print range elements thar are greater than the
# last element of sorted array.
while (x <= high):
print(x, end =" ")
x = x + 1
# Driver code
arr = [1, 3, 5, 4]
n = len(arr)
low = 1
high = 10
printMissing(arr, n, low, high);
# This code is contributed by YatinGupta
C#
// A sorting based Java program to
// find missing elements from an array
using System;
class GFG {
// Print all elements of range
// [low, high] that are not
// present in arr[0..n-1]
static void printMissing(int[] ar,
int low, int high)
{
Array.Sort(ar);
// Do binary search for 'low' in sorted
// array and find index of first element
// which either equal to or greater than
// low.
int index = ceilindex(ar, low, 0,
ar.Length - 1);
int x = low;
// Start from the found index and linearly
// search every range element x after this
// index in arr[]
while (index < ar.Length && x <= high) {
// If x doesn't math with current
// element print it
if (ar[index] != x) {
Console.Write(x + " ");
}
// If x matches, move to next
// element in arr[]
else
index++;
// Move to next element in
// range [low, high]
x++;
}
// Print range elements thar
// are greater than the
// last element of sorted array.
while (x <= high) {
Console.Write(x + " ");
x++;
}
}
// Utility function to find
// ceil index of given element
static int ceilindex(int[] ar, int val,
int low, int high)
{
if (val < ar[0])
return 0;
if (val > ar[ar.Length - 1])
return ar.Length;
int mid = (low + high) / 2;
if (ar[mid] == val)
return mid;
if (ar[mid] < val) {
if (mid + 1 < high && ar[mid + 1] >= val)
return mid + 1;
return ceilindex(ar, val, mid + 1, high);
}
else {
if (mid - 1 >= low && ar[mid - 1] < val)
return mid;
return ceilindex(ar, val, low, mid - 1);
}
}
// Driver Code
static public void Main()
{
int[] arr = { 1, 3, 5, 4 };
int low = 1, high = 10;
printMissing(arr, low, high);
}
}
// This code is contributed
// by Sach_Code
C++14
// An array based C++ program
// to find missing elements from
// an array
#include
using namespace std;
// Print all elements of range
// [low, high] that are not present
// in arr[0..n-1]
void printMissing(
int arr[], int n,
int low, int high)
{
// Create boolean array of size
// high-low+1, each index i representing
// wether (i+low)th element found or not.
bool points_of_range[high - low + 1] = { false };
for (int i = 0; i < n; i++) {
// if ith element of arr is in
// range low to high then mark
// corresponding index as true in array
if (low <= arr[i] && arr[i] <= high)
points_of_range[arr[i] - low] = true;
}
// Traverse through the range and
// print all elements whose value
// is false
for (int x = 0; x <= high - low; x++) {
if (points_of_range[x] == false)
cout << low + x << " ";
}
}
// Driver program
int main()
{
int arr[] = { 1, 3, 5, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
int low = 1, high = 10;
printMissing(arr, n, low, high);
return 0;
}
// This code is contributed by Shubh Bansal
Java
// An array based Java program
// to find missing elements from
// an array
import java.util.Arrays;
public class Print {
// Print all elements of range
// [low, high] that are not present
// in arr[0..n-1]
static void printMissing(
int arr[], int low,
int high)
{
// Create boolean array of
// size high-low+1, each index i
// representing wether (i+low)th
// element found or not.
boolean[] points_of_range = new boolean
[high - low + 1];
for (int i = 0; i < arr.length; i++) {
// if ith element of arr is in
// range low to high then mark
// corresponding index as true in array
if (low <= arr[i] && arr[i] <= high)
points_of_range[arr[i] - low] = true;
}
// Traverse through the range and print all
// elements whose value is false
for (int x = 0; x <= high - low; x++) {
if (points_of_range[x] == false)
System.out.print((low + x) + " ");
}
}
// Driver program to test above function
public static void main(String[] args)
{
int arr[] = { 1, 3, 5, 4 };
int low = 1, high = 10;
printMissing(arr, low, high);
}
}
// This code is contributed by Shubh Bansal
Python3
# An array-based Python3 program to
# find missing elements from an array
# Print all elements of range
# [low, high] that are not
# present in arr[0..n-1]
def printMissing(arr, n, low, high):
# Create boolean list of size
# high-low+1, each index i
# representing wether (i+low)th
# element found or not.
points_of_range = [False] * (high-low+1)
for i in range(n) :
# if ith element of arr is in range
# low to high then mark corresponding
# index as true in array
if ( low <= arr[i] and arr[i] <= high ) :
points_of_range[arr[i]-low] = True
# Traverse through the range
# and print all elements whose value
# is false
for x in range(high-low+1) :
if (points_of_range[x]==False) :
print(low+x, end = " ")
# Driver Code
arr = [1, 3, 5, 4]
n = len(arr)
low, high = 1, 10
printMissing(arr, n, low, high)
# This code is contributed
# by Shubh Bansal
C#
// An array based C# program
// to find missing elements from
// an array
using System;
class GFG{
// Print all elements of range
// [low, high] that are not present
// in arr[0..n-1]
static void printMissing(int[] arr, int n,
int low, int high)
{
// Create boolean array of size
// high-low+1, each index i representing
// wether (i+low)th element found or not.
bool[] points_of_range = new bool[high - low + 1];
for(int i = 0; i < high - low + 1; i++)
points_of_range[i] = false;
for(int i = 0; i < n; i++)
{
// If ith element of arr is in
// range low to high then mark
// corresponding index as true in array
if (low <= arr[i] && arr[i] <= high)
points_of_range[arr[i] - low] = true;
}
// Traverse through the range and
// print all elements whose value
// is false
for(int x = 0; x <= high - low; x++)
{
if (points_of_range[x] == false)
Console.Write("{0} ", low + x);
}
}
// Driver code
public static void Main()
{
int[] arr = { 1, 3, 5, 4 };
int n = arr.Length;
int low = 1, high = 10;
printMissing(arr, n, low, high);
}
}
// This code is contributed by subhammahato348
C++
// A hashing based C++ program to find missing
// elements from an array
#include
using namespace std;
// Print all elements of range [low, high] that
// are not present in arr[0..n-1]
void printMissing(int arr[], int n, int low,
int high)
{
// Insert all elements of arr[] in set
unordered_set s;
for (int i = 0; i < n; i++)
s.insert(arr[i]);
// Traverse throught the range an print all
// missing elements
for (int x = low; x <= high; x++)
if (s.find(x) == s.end())
cout << x << " ";
}
// Driver program
int main()
{
int arr[] = { 1, 3, 5, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
int low = 1, high = 10;
printMissing(arr, n, low, high);
return 0;
}
Java
// A hashing based Java program to find missing
// elements from an array
import java.util.Arrays;
import java.util.HashSet;
public class Print {
// Print all elements of range [low, high] that
// are not present in arr[0..n-1]
static void printMissing(int ar[], int low, int high)
{
HashSet hs = new HashSet<>();
// Insert all elements of arr[] in set
for (int i = 0; i < ar.length; i++)
hs.add(ar[i]);
// Traverse throught the range an print all
// missing elements
for (int i = low; i <= high; i++) {
if (!hs.contains(i)) {
System.out.print(i + " ");
}
}
}
// Driver program to test above function
public static void main(String[] args)
{
int arr[] = { 1, 3, 5, 4 };
int low = 1, high = 10;
printMissing(arr, low, high);
}
}
// This code is contributed by Rishabh Mahrsee
Python3
# A hashing based Python3 program to
# find missing elements from an array
# Print all elements of range
# [low, high] that are not
# present in arr[0..n-1]
def printMissing(arr, n, low, high):
# Insert all elements of
# arr[] in set
s = set(arr)
# Traverse through the range
# and print all missing elements
for x in range(low, high + 1):
if x not in s:
print(x, end = ' ')
# Driver Code
arr = [1, 3, 5, 4]
n = len(arr)
low, high = 1, 10
printMissing(arr, n, low, high)
# This code is contributed
# by SamyuktaSHegde
C#
// A hashing based C# program to
// find missing elements from an array
using System;
using System.Collections.Generic;
class GFG {
// Print all elements of range
// [low, high] that are not
// present in arr[0..n-1]
static void printMissing(int[] arr, int n,
int low, int high)
{
// Insert all elements of arr[] in set
HashSet s = new HashSet();
for (int i = 0; i < n; i++) {
s.Add(arr[i]);
}
// Traverse throught the range
// an print all missing elements
for (int x = low; x <= high; x++)
if (!s.Contains(x))
Console.Write(x + " ");
}
// Driver Code
public static void Main()
{
int[] arr = { 1, 3, 5, 4 };
int n = arr.Length;
int low = 1, high = 10;
printMissing(arr, n, low, high);
}
}
// This code is contributed by ihritik
输出:
2 6 7 8 9 10
使用数组:创建一个布尔数组,其中每个索引将表示数组中是否存在第(i + low)个元素。标记所有在给定范围内并且存在于数组中的元素。一旦在给定范围内存在的所有数组项都在数组中标记为true,我们将遍历布尔数组并打印所有值为false的元素。
C++ 14
// An array based C++ program
// to find missing elements from
// an array
#include
using namespace std;
// Print all elements of range
// [low, high] that are not present
// in arr[0..n-1]
void printMissing(
int arr[], int n,
int low, int high)
{
// Create boolean array of size
// high-low+1, each index i representing
// wether (i+low)th element found or not.
bool points_of_range[high - low + 1] = { false };
for (int i = 0; i < n; i++) {
// if ith element of arr is in
// range low to high then mark
// corresponding index as true in array
if (low <= arr[i] && arr[i] <= high)
points_of_range[arr[i] - low] = true;
}
// Traverse through the range and
// print all elements whose value
// is false
for (int x = 0; x <= high - low; x++) {
if (points_of_range[x] == false)
cout << low + x << " ";
}
}
// Driver program
int main()
{
int arr[] = { 1, 3, 5, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
int low = 1, high = 10;
printMissing(arr, n, low, high);
return 0;
}
// This code is contributed by Shubh Bansal
Java
// An array based Java program
// to find missing elements from
// an array
import java.util.Arrays;
public class Print {
// Print all elements of range
// [low, high] that are not present
// in arr[0..n-1]
static void printMissing(
int arr[], int low,
int high)
{
// Create boolean array of
// size high-low+1, each index i
// representing wether (i+low)th
// element found or not.
boolean[] points_of_range = new boolean
[high - low + 1];
for (int i = 0; i < arr.length; i++) {
// if ith element of arr is in
// range low to high then mark
// corresponding index as true in array
if (low <= arr[i] && arr[i] <= high)
points_of_range[arr[i] - low] = true;
}
// Traverse through the range and print all
// elements whose value is false
for (int x = 0; x <= high - low; x++) {
if (points_of_range[x] == false)
System.out.print((low + x) + " ");
}
}
// Driver program to test above function
public static void main(String[] args)
{
int arr[] = { 1, 3, 5, 4 };
int low = 1, high = 10;
printMissing(arr, low, high);
}
}
// This code is contributed by Shubh Bansal
Python3
# An array-based Python3 program to
# find missing elements from an array
# Print all elements of range
# [low, high] that are not
# present in arr[0..n-1]
def printMissing(arr, n, low, high):
# Create boolean list of size
# high-low+1, each index i
# representing wether (i+low)th
# element found or not.
points_of_range = [False] * (high-low+1)
for i in range(n) :
# if ith element of arr is in range
# low to high then mark corresponding
# index as true in array
if ( low <= arr[i] and arr[i] <= high ) :
points_of_range[arr[i]-low] = True
# Traverse through the range
# and print all elements whose value
# is false
for x in range(high-low+1) :
if (points_of_range[x]==False) :
print(low+x, end = " ")
# Driver Code
arr = [1, 3, 5, 4]
n = len(arr)
low, high = 1, 10
printMissing(arr, n, low, high)
# This code is contributed
# by Shubh Bansal
C#
// An array based C# program
// to find missing elements from
// an array
using System;
class GFG{
// Print all elements of range
// [low, high] that are not present
// in arr[0..n-1]
static void printMissing(int[] arr, int n,
int low, int high)
{
// Create boolean array of size
// high-low+1, each index i representing
// wether (i+low)th element found or not.
bool[] points_of_range = new bool[high - low + 1];
for(int i = 0; i < high - low + 1; i++)
points_of_range[i] = false;
for(int i = 0; i < n; i++)
{
// If ith element of arr is in
// range low to high then mark
// corresponding index as true in array
if (low <= arr[i] && arr[i] <= high)
points_of_range[arr[i] - low] = true;
}
// Traverse through the range and
// print all elements whose value
// is false
for(int x = 0; x <= high - low; x++)
{
if (points_of_range[x] == false)
Console.Write("{0} ", low + x);
}
}
// Driver code
public static void Main()
{
int[] arr = { 1, 3, 5, 4 };
int n = arr.Length;
int low = 1, high = 10;
printMissing(arr, n, low, high);
}
}
// This code is contributed by subhammahato348
输出:
2 6 7 8 9 10
使用哈希:创建哈希表并将所有数组项插入哈希表。一旦所有项目都在哈希表中,遍历范围并打印所有缺少的元素。
C++
// A hashing based C++ program to find missing
// elements from an array
#include
using namespace std;
// Print all elements of range [low, high] that
// are not present in arr[0..n-1]
void printMissing(int arr[], int n, int low,
int high)
{
// Insert all elements of arr[] in set
unordered_set s;
for (int i = 0; i < n; i++)
s.insert(arr[i]);
// Traverse throught the range an print all
// missing elements
for (int x = low; x <= high; x++)
if (s.find(x) == s.end())
cout << x << " ";
}
// Driver program
int main()
{
int arr[] = { 1, 3, 5, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
int low = 1, high = 10;
printMissing(arr, n, low, high);
return 0;
}
Java
// A hashing based Java program to find missing
// elements from an array
import java.util.Arrays;
import java.util.HashSet;
public class Print {
// Print all elements of range [low, high] that
// are not present in arr[0..n-1]
static void printMissing(int ar[], int low, int high)
{
HashSet hs = new HashSet<>();
// Insert all elements of arr[] in set
for (int i = 0; i < ar.length; i++)
hs.add(ar[i]);
// Traverse throught the range an print all
// missing elements
for (int i = low; i <= high; i++) {
if (!hs.contains(i)) {
System.out.print(i + " ");
}
}
}
// Driver program to test above function
public static void main(String[] args)
{
int arr[] = { 1, 3, 5, 4 };
int low = 1, high = 10;
printMissing(arr, low, high);
}
}
// This code is contributed by Rishabh Mahrsee
Python3
# A hashing based Python3 program to
# find missing elements from an array
# Print all elements of range
# [low, high] that are not
# present in arr[0..n-1]
def printMissing(arr, n, low, high):
# Insert all elements of
# arr[] in set
s = set(arr)
# Traverse through the range
# and print all missing elements
for x in range(low, high + 1):
if x not in s:
print(x, end = ' ')
# Driver Code
arr = [1, 3, 5, 4]
n = len(arr)
low, high = 1, 10
printMissing(arr, n, low, high)
# This code is contributed
# by SamyuktaSHegde
C#
// A hashing based C# program to
// find missing elements from an array
using System;
using System.Collections.Generic;
class GFG {
// Print all elements of range
// [low, high] that are not
// present in arr[0..n-1]
static void printMissing(int[] arr, int n,
int low, int high)
{
// Insert all elements of arr[] in set
HashSet s = new HashSet();
for (int i = 0; i < n; i++) {
s.Add(arr[i]);
}
// Traverse throught the range
// an print all missing elements
for (int x = low; x <= high; x++)
if (!s.Contains(x))
Console.Write(x + " ");
}
// Driver Code
public static void Main()
{
int[] arr = { 1, 3, 5, 4 };
int n = arr.Length;
int low = 1, high = 10;
printMissing(arr, n, low, high);
}
}
// This code is contributed by ihritik
输出:
2 6 7 8 9 10
哪种方法更好?
第一种方法的时间复杂度是O(nLogn + k),其中k是丢失元素的数量(请注意,如果数组较小且范围较大,则k可能大于nLogn)
第二个和第三个解决方案的时间复杂度为O(n +(high-low + 1))。
如果给定的数组几乎具有范围内的元素,即n接近(high-low + 1)的值,则第二和第三种方法肯定更好,因为没有Log n因子。但是,如果n小于范围,则第一种方法会更好,因为它不需要用于散列的额外空间。我们还可以修改第一种方法以将相邻的缺失元素打印为范围,以节省时间。例如,如果缺少50、51、52、53、54、59,我们可以在第一种方法中将它们打印为50-54、59。如果允许以这种方式打印,则第一种方法仅需要O(n Log n)时间。
在第二和第三解决方案之外,第二解决方案更好,因为第二种解决方案在最坏情况下的时间复杂度比第三种更好。