前往
大廳
主題

LeetCode - 1539. Kth Missing Positive Number 解題心得

Not In My Back Yard | 2022-12-15 12:00:16 | 巴幣 0 | 人氣 192

題目連結:


題目意譯:
給定一個以嚴格遞增排序的正整數陣列 arr,以及一整數 k。

回傳陣列中第 k 個沒有出現於陣列中的正整數。

限制:
1 ≦ arr.length ≦ 1000
1 ≦ arr[i] ≦ 1000
1 ≦ k ≦ 1000
arr[i] < arr[j] for 1 ≦ i < j ≦ arr.length
 
進階:
你可以在小於 O(n) 的時間複雜度得到答案嗎?



範例測資:
範例 1:
輸入: arr = [2,3,4,7,11], k = 5
輸出: 9
解釋: 沒有出現陣列中的整數為 [1,5,6,8,9,10,12,13,…]。其中第 5 個整數為 9。

範例 2:
輸入: arr = [1,2,3,4], k = 2
輸出: 6
解釋: 沒有出現陣列中的整數為 [5,6,7,…]。其中第 2 個整數為 6。


解題思維:
因為 arr 已經由小排到大了,因此我們可以使用二分搜尋法(Binary Search)來找到第 k 個沒有出現於陣列中的正整數(稱其為 x)位於 arr 中哪兩個數字之間(即 arr[i - 1] < x arr[i])。

首先如果 k < arr[0],則代表 arr[0] 前已經有 k 個沒有出現於陣列中的正整數了。因此 k 本身就是我們要找的 x。



接著我們利用二分搜來找猜上面提到的 arr[i] 是誰。

假設現在猜的是 arr[m],而因為 1 ~ arr[m] 有 arr[m] 個正整數,而 arr[0] ~ arr[m] 有 m + 1 個正整數,因此沒有出現於 arr 中並且 < arr[m] 的正整數數量為 arr[m] - m - 1 個(令此值為 C)。

如果 C < k,那表示 x 不可能位於 arr[m - 1] ~ arr[m] 之間,因此我們應該要猜更大的 m 值才對;反之,我們確保了 x < arr[m],因此我們可以試著猜小一點的 m 值。

最後我們得到一個最小且可行的 m 值時,此時 x 即為 k + m + 1。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作