给定两个序列,一个是递增序列a [] ,另一个是正常序列b [] ,在递增序列中找到第K个缺失元素,该元素在给定序列中不存在。如果没有第k个缺失元素,则输出-1
例子:
Input: a[] = {0, 2, 4, 6, 8, 10, 12, 14, 15};
b[] = {4, 10, 6, 8, 12};
k = 3
Output: 14
Explanation : The numbers from increasing sequence that
are not present in the given sequence are 0, 2, 14, 15.
The 3rd missing number is 14.
n1递增序列a []上的元素数。
n2给定序列b []中的元素数。
天真的方法是对递增序列中的每个元素进行迭代,并检查它是否存在于给定序列中,并保留不存在元素的计数器,并打印第k个不存在元素。这将不够高效,因为它有两个嵌套的for循环,这些循环将占用O(n2)。
时间复杂度:O(n1 * n2)
辅助空间:O(1)
一种有效的方法是使用哈希。我们将给定序列的所有元素存储在哈希表中。然后,我们迭代增加顺序的所有元素。对于每个元素,我们都在哈希表中对其进行搜索。如果元素存在于非哈希表中,则我们增加缺少元素的数量。如果count变为k,则返回缺少的元素。
下面是上述方法的实现
C++
// C++ program to find the k-th missing element
// in a given sequence
#include
using namespace std;
// Returns k-th missing element. It returns -1 if
// no k is more than number of missing elements.
int find(int a[], int b[], int k, int n1, int n2)
{
// Insert all elements of givens sequence b[].
unordered_set s;
for (int i = 0; i < n2; i++)
s.insert(b[i]);
// Traverse through increasing sequence and
// keep track of count of missing numbers.
int missing = 0;
for (int i = 0; i < n1; i++) {
if (s.find(a[i]) == s.end())
missing++;
if (missing == k)
return a[i];
}
return -1;
}
// driver program to test the above function
int main()
{
int a[] = { 0, 2, 4, 6, 8, 10, 12, 14, 15 };
int b[] = { 4, 10, 6, 8, 12 };
int n1 = sizeof(a) / sizeof(a[0]);
int n2 = sizeof(b) / sizeof(b[0]);
int k = 3;
cout << find(a, b, k, n1, n2);
return 0;
}
Java
// Java program to find the k-th missing element
// in a given sequence
import java.util.*;
class GFG
{
// Returns k-th missing element. It returns -1 if
// no k is more than number of missing elements.
static int find(int a[], int b[], int k, int n1, int n2)
{
// Insert all elements of givens sequence b[].
LinkedHashSet s = new LinkedHashSet<>();
for (int i = 0; i < n2; i++)
s.add(b[i]);
// Traverse through increasing sequence and
// keep track of count of missing numbers.
int missing = 0;
for (int i = 0; i < n1; i++)
{
if(!s.contains(a[i]) )
missing++;
if (missing == k)
return a[i];
}
return -1;
}
// Driver code
public static void main(String[] args)
{
int a[] = { 0, 2, 4, 6, 8, 10, 12, 14, 15 };
int b[] = { 4, 10, 6, 8, 12 };
int n1 = a.length;
int n2 = b.length;
int k = 3;
System.out.println(find(a, b, k, n1, n2));
}
}
// This code has been contributed by 29AjayKumar
Python3
# Python3 program to find the k-th
# missing element in a given sequence
# Returns k-th missing element. It returns -1 if
# no k is more than number of missing elements.
def find(a, b, k, n1, n2):
# insert all elements of
# given sequence b[].
s = set()
for i in range(n2):
s.add(b[i])
# Traverse through increasing sequence and
# keep track of count of missing numbers.
missing = 0
for i in range(n1):
if a[i] not in s:
missing += 1
if missing == k:
return a[i]
return -1
# Driver code
a = [0, 2, 4, 6, 8, 10, 12, 14, 15]
b = [4, 10, 6, 8, 12]
n1 = len(a)
n2 = len(b)
k = 3
print(find(a, b, k, n1, n2))
# This code is contributed by Shrikant13
C#
// C# program to find the k-th missing element
// in a given sequence
using System;
using System.Collections.Generic;
class GFG
{
// Returns k-th missing element. It returns -1 if
// no k is more than number of missing elements.
static int find(int []a, int []b, int k, int n1, int n2)
{
// Insert all elements of givens sequence b[].
HashSet s = new HashSet();
for (int i = 0; i < n2; i++)
s.Add(b[i]);
// Traverse through increasing sequence and
// keep track of count of missing numbers.
int missing = 0;
for (int i = 0; i < n1; i++)
{
if(!s.Contains(a[i]) )
missing++;
if (missing == k)
return a[i];
}
return -1;
}
// Driver code
public static void Main(String[] args)
{
int []a = { 0, 2, 4, 6, 8, 10, 12, 14, 15 };
int []b = { 4, 10, 6, 8, 12 };
int n1 = a.Length;
int n2 = b.Length;
int k = 3;
Console.WriteLine(find(a, b, k, n1, n2));
}
}
/* This code contributed by PrinciRaj1992 */
输出:
14
时间复杂度: O(n1 + n2)
辅助空间: O(n2)