二分法:两个有序数组长度为N,找到第N、N+1大的数
題目
兩個(gè)有序數(shù)組長(zhǎng)度為N,找到第N、N+1大的數(shù)
思路1:雙指針,O(N)復(fù)雜度
簡(jiǎn)述思路:
如果當(dāng)前A指針指向的數(shù)組A的內(nèi)容小于B指針指向的數(shù)組B的內(nèi)容,那么A指針往右移動(dòng),然后nums(當(dāng)前已經(jīng)遍歷過(guò)的數(shù)字個(gè)數(shù))也加一。
如果此時(shí)已經(jīng)遍歷過(guò)的數(shù)字個(gè)數(shù)等于N那么九江移動(dòng)之前的A指針指向的A數(shù)組的內(nèi)容送入result。
其他情況,以相反的邏輯進(jìn)行。
思路2:迭代法二分
簡(jiǎn)述思路:
先初始化ab數(shù)組的start,end,mid;
然后比較各自mid指向的值的大小。
如果A[a_mid] > B[b_mid],說(shuō)明,第N大的值在A數(shù)組a_mid的左邊,在B數(shù)組b_mid的右邊,所以對(duì)a_end以及b_start做出更新:
長(zhǎng)度為奇數(shù)的時(shí)候,正好
a_end = a_mid;
b_start = b_mid;
當(dāng)然還要考慮到長(zhǎng)度為偶數(shù)的情況:
a_end = a_mid;
b_start = b_mid + 1;
這里只是對(duì)start進(jìn)行修改,對(duì)于end值不需要修改??梢耘e例:
A = {2,4,6,8};
B= {1,3,5,7};
a_start = 0,a_end = 3
b_start = 0,b_end = 3
a_mid = b_mid = 3/2 =1;
A[a_mid] > B[b_mid] ,并且,長(zhǎng)度為偶數(shù),所以
a_end = a_mid =1;
b_start = b_mid +1 =2;
所以A被分割為:{2,4};
B被分割為:{5,7};
a_start = 0,a_end = 1
b_start = 2,b_end = 3
a_mid = 1/2 =0;
b_mid = (2+3)/2= 2;
A[a_mid] < B[b_mid] ,并且,長(zhǎng)度為偶數(shù),所以
a_start = a_mid =1;
b_end = b_mid =2;
此時(shí)達(dá)成a_start == a_end || b_start == b_end條件,所以可以判斷兩個(gè)start的值的大小,取較小值可得到第N大的數(shù):
思路3:遞歸法二分
寫完迭代法之后,遞歸將a_start,a_end,b_start,b_end,作為遞歸函數(shù)的參數(shù)放入。遞歸函數(shù)的一開(kāi)始寫終止條件,參考迭代法。
終止條件后面,寫根據(jù)中間值的大小,對(duì)a_start,a_end,b_start,b_end進(jìn)行不同賦值,達(dá)到分割數(shù)組的目的。
總結(jié)
以上是生活随笔為你收集整理的二分法:两个有序数组长度为N,找到第N、N+1大的数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 弹药在PKC怎么把血量堆到32W以上啊?
- 下一篇: leetcode 53. 最大子序和 动