Welcome to Subscribe On Youtube

Question

Formatted question description: https://leetcode.ca/all/1539.html

 1539. Kth Missing Positive Number

 Given an array arr of positive integers sorted in a strictly increasing order, and an integer k.

 Find the kth positive integer that is missing from this array.


 Example 1:

 Input: arr = [2,3,4,7,11], k = 5
 Output: 9
 Explanation: The missing positive integers are [1,5,6,8,9,10,12,13,...]. The 5th missing positive integer is 9.


 Example 2:

 Input: arr = [1,2,3,4], k = 2
 Output: 6
 Explanation: The missing positive integers are [5,6,7,...]. The 2nd missing positive integer is 6.


 Constraints:

     1 <= arr.length <= 1000
     1 <= arr[i] <= 1000
     1 <= k <= 1000
     arr[i] < arr[j] for 1 <= i < j <= arr.length

Algorithm

o(N)

A linear solution is because the title gives an array of positive integers in ascending order, and the array theoretically starts from 1. So ideally, the relationship between the number nums[i] and its corresponding subscript i should be nums[i] = i + 1. So when scanning the input array, if the difference between the number and its corresponding subscript is greater than 1, it means that the number is missing in the middle. When the gap is greater than or equal to K, the Kth missing number is found.

o(logN)

Binary search. Because the input array is ordered, find the midpoint in mid, which is similar to the second approach, comparing the current number on the index with the difference between the index. If the difference is less than K, look for the right half of the array; otherwise, look for the left half of the array.

Code

  • class Solution {
        public int findKthPositive(int[] arr, int k) {
            List<Integer> list = new ArrayList<Integer>();
            int length = arr.length;
            int max = arr[length - 1];
            int index = 0;
            for (int i = 1; i < max; i++) {
                if (arr[index] == i)
                    index++;
                else
                    list.add(i);
            }
            int size = list.size();
            if (size >= k)
                return list.get(k - 1);
            else
                return max + k - size;
        }
    }
    
    ############
    
    class Solution {
        public int findKthPositive(int[] arr, int k) {
            if (arr[0] > k) {
                return k;
            }
            int left = 0, right = arr.length;
            while (left < right) {
                int mid = (left + right) >> 1;
                if (arr[mid] - mid - 1 >= k) {
                    right = mid;
                } else {
                    left = mid + 1;
                }
            }
            return arr[left - 1] + k - (arr[left - 1] - (left - 1) - 1);
        }
    }
    
  • // OJ: https://leetcode.com/problems/kth-missing-positive-number/
    // Time: O(N)
    // Space: O(1)
    class Solution {
    public:
        int findKthPositive(vector<int>& A, int k) {
            for (int i = 1, j = 0; i <= 2000; ++i) {
                if (j < A.size() && A[j] == i) ++j;
                else if (--k == 0) return i;
            }
            return -1;
        }
    };
    
  • class Solution:
        def findKthPositive(self, arr: List[int], k: int) -> int:
            if arr[0] > k:
                return k
            left, right = 0, len(arr)
            while left < right:
                mid = (left + right) >> 1
                if arr[mid] - mid - 1 >= k:
                    right = mid
                else:
                    left = mid + 1
            return arr[left - 1] + k - (arr[left - 1] - (left - 1) - 1)
    
    
    
  • func findKthPositive(arr []int, k int) int {
    	if arr[0] > k {
    		return k
    	}
    	left, right := 0, len(arr)
    	for left < right {
    		mid := (left + right) >> 1
    		if arr[mid]-mid-1 >= k {
    			right = mid
    		} else {
    			left = mid + 1
    		}
    	}
    	return arr[left-1] + k - (arr[left-1] - (left - 1) - 1)
    }
    

All Problems

All Solutions