주어진 시퀀스에 존재하지 않는 증가하는 시퀀스의 k 번째 누락 요소  


난이도 쉽게
자주 묻는 질문 Expedia 팩트 셋 IBM SAP 연구소
배열 해시 수색

"주어진 시퀀스에 존재하지 않는 증가하는 시퀀스에서 k 번째 누락 요소"문제는 두 개의 배열이 제공된다는 것을 나타냅니다. 그들 중 하나는 오름차순으로 배열되고 또 다른 일반 정렬되지 않은 배열은 숫자 k입니다. 정상 시퀀스에는 없지만 오름차순 시퀀스 배열에는 존재하는 k 번째 누락 요소를 찾습니다.

예  

주어진 시퀀스에 존재하지 않는 증가하는 시퀀스의 k 번째 누락 요소

[0, 2, 4, 6, 8, 10, 12, 14]
[4, 10, 6, 12, 2 ]
k=2
8

설명

주어진 배열에없는 증가하는 시퀀스의 숫자는 0,8,14입니다.

K 개의th 누락 된 번호 즉, 2nd 숫자는 8

주어진 시퀀스에 존재하지 않는 증가하는 시퀀스에서 k 번째 누락 요소를 찾는 알고리즘  

  1. 선언 해시셋.
  2. 두 번째 배열의 모든 요소를 ​​HashSet에 넣습니다.
  3. 세트 누락 수 0합니다.
  4. 증가하는 순차적 배열을 탐색하는 동안 다음을 확인하십시오.
    1. 집합에 순차 배열 요소가 포함되어 있지 않은 경우
      1. missingCount 값을 1 씩 늘립니다.
      2. missingCount 값이 k와 같은지 확인하십시오.
        • 참이면 해당 배열 [i]을 반환합니다.
  5. 루프에서 -1을 반환합니다.

설명

두 개의 배열과 숫자 k가 주어집니다. 두 배열 중 하나는 증가하는 시퀀스이고 다른 하나는 정렬되지 않은 정상적인 시퀀스입니다. 문제 설명은 정렬되지 않은 배열에없는 정렬 된 시퀀스 배열에서 k 번째 누락 된 요소를 찾아야한다고 말합니다.

참조
a + b + c = d가되도록 배열에서 가장 큰 d 찾기

이를 위해 세트를 사용할 것입니다. 두 번째 배열을 탐색 할 것입니다. 비[] 모든 값을 세트에 삽입합니다. 나중에 확인하고 첫 번째 배열과 세트를 비교할 수 있기 때문입니다. ㅏ[]. 배열 a []를 순회하는 동안 집합에 배열 a [i]의 특정 값이 포함되어 있지 않은 경우. 우리는 가치를 증가시킵니다 누락 수 1 씩 동시에 missingCount가 주어진 숫자 k와 같은지 확인합니다. 그렇다면 첫 번째 배열의 해당 요소를 반환 할 수 있습니다.

한 가지 예를 살펴보고 이해해 보겠습니다.

배열 a [] = [0, 2, 4, 6, 8, 10, 12, 14]

b [] = [4, 10, 6, 12, 2]

k = 2

알고리즘에 따라 배열 b [] 요소를 집합에 넣어야합니다. 배열 b []를 탐색하여이를 수행합니다.

세트는 {4, 10, 6, 12, 2}가됩니다.

배열 a [] 요소를 순회하고 set에 arr [i] 요소가 포함되어 있지 않은지 확인해야합니다.

i = 0, arr [i] = 0

세트에 포함되지 않으므로 missingCount = missingCount + 1이 증가합니다.

missingCount = 1, missingCount == k, false인지 확인합니다.

i = 1, arr [i] = 2

set에는 해당 값 '2'가 포함되어 있으므로 아무것도하지 않습니다.

i = 2, arr [i] = 4

set에는 해당 값 '4'가 포함되어 있으므로 아무것도하지 않습니다.

i = 3, arr [i] = 6

set에는 해당 값 '6'가 포함되어 있으므로 아무것도하지 않습니다.

i = 4, arr [i] = 8

세트에 8이 포함되어 있지 않으므로 missingCount = missingCount + 1이 증가합니다.

missingCount = 2, missingCount == k인지 확인합니다. true이므로 '8'인 arr [i]를 반환합니다.

출력은 8이됩니다.

참조
배열에서 일정한 시간 범위 추가 작업

암호  

주어진 시퀀스에 존재하지 않는 증가하는 시퀀스에서 k 번째 누락 요소를 찾는 C ++ 코드

#include <unordered_set>
#include<iostream>

using namespace std;
int find(int A[], int B[], int k, int l1, int l2)
{
  unordered_set<int> myset;
  for (int i = 0; i < l2; i++)
    myset.insert(B[i]);

  int missingCount = 0;
  for (int i = 0; i < l1; i++) {
    if (myset.find(A[i]) == myset.end())
      missingCount++;
    if (missingCount == k)
      return A[i];
  }

  return -1;
}
int main()
{
    int a[] = { 0, 2, 4, 6, 8, 10, 12, 14};
    int b[] = { 4, 10, 6, 12, 2 };

  int l1 = sizeof(a) / sizeof(a[0]);
  int l2 = sizeof(b) / sizeof(b[0]);

  int k = 2;
  cout << find(a, b, k, l1, l2);
  return 0;
}
8

주어진 시퀀스에 존재하지 않는 증가하는 시퀀스에서 k 번째 누락 된 요소를 찾는 Java 코드

import java.util.LinkedHashSet;

class kthMissingElement
{
    public static int getMissingElement(int A[], int B[], int k, int l1, int l2)
    {
        LinkedHashSet<Integer> hashset = new LinkedHashSet<>();
        for (int i = 0; i < l2; i++)
            hashset.add(B[i]);

        int missingCount = 0;
        for (int i = 0; i < l1; i++)
        {
            if(!hashset.contains(A[i]) )
                missingCount++;
            if (missingCount == k)
                return A[i];
        }

        return -1;
    }
    public static void main(String[] args)
    {
        int a[] = { 0, 2, 4, 6, 8, 10, 12, 14};
        int b[] = { 4, 10, 6, 12, 2 };
        int l1 = a.length;
        int l2 = b.length;

        int k = 2;
        System.out.println(getMissingElement(a, b, k, l1, l2));
    }
}
8

복잡성 분석  

시간 복잡성

O (n1 + n2) 어디에 "n1" 및 "n2" array1 및 array2의 길이입니다. 두 배열의 모든 요소를 ​​순회했기 때문입니다. 시간 복잡도는 선형입니다.

공간 복잡성

O (n2) 어디에 "n2" array2의 길이입니다. 두 번째 배열의 요소 만 HashSet에 저장했기 때문에 필요한 공간도 선형입니다.