題目:
兩個升序等長數組num1
和num2
,找出兩個數組中所有元素裏的第k
小的數,兩個數組長度均爲n
,且n >= k >= 1
,寫出find_kth_number
返回第k
小的數組
思路一:歸併優化O(k)
使用歸併排序的合併方法:
步驟:
1、兩個指針p1
,p2
分別指向num1
和num2
的頭
2、若num1[p1] <= num2[p2]
; p1++
;反之,p2++
3、while
循環k - 1
次,跳出循環的p1
和p2
所指數中誰小誰爲所求
【注意】 要考慮到超界問題(當p1
或p2
走到空的情況)
int find_kth_number(int *num1, int *num2, int n, int k) {
}
代碼演示
int find_kth_number(int *num1, int *num2, int n, int k) {
//雙指針
int p1 = 0, p2 = 0;
while (--k) {
//注意判斷指針所指是否合法
if (p1 < n && num1[p1] <= num2[p2]) ++p1;
else ++p2;
}
//指針超界操作
if (p1 >= n) return num2[p2];
if (p2 >= n) return num1[p1];
return num1[p1] <= num2[p2] ? num1[p1] : num2[p2];
}