LeetCode 4 兩組有序陣列尋找中位數

2021-10-25 13:43:16 字數 2234 閱讀 4228

題目參見尋找兩個正序陣列的中位數。思路來自leetcode的官方題解。

尋找兩個正序陣列的中位數 給定兩個大小為 m 和 n 的正序(從小到大)陣列 nums1 和nums2。請你找出並返回這兩個正序陣列的中位數。如果是奇數,則返回第(m+n+1)/2小的數字,如果是偶數,則返回第(m+n)/2小的數和第(m+n)/2+1小的數兩數平均值。

由於題目中的兩個陣列都是有序陣列,所以可以開闢乙個空間大小為m+n

m+nm+

n的陣列,用以儲存歸併後的新有序陣列。每次從兩個陣列之中選擇乙個較小的數字放到歸併後的新陣列中,最後從新陣列裡面挑選題目要求的中位數,並返回即可。

事實上,我們並不需要真正的開闢乙個空間大小為m+n

m+nm+

n這麼大的新陣列,我們其實只需要第(m+n+1)/2大的這乙個數字(如果是偶數,則需要兩個)數字而已,何必要開乙個完整陣列用以儲存呢?所以,維護乙個數字,在兩個陣列間進行兩兩比較的時候,只存留兩個陣列間最小的那個數字,一直遞增下標,直到找到第(m+n+1)/2小的數字為止即可。這樣空間複雜度則降為了o(1

)o(1)

o(1)

級別。**如下:

class

solution

if(n%2)

else

if(i < la) ans = a[i++];

else

if(j < lb) ans = b[j++];

id++;}

while

(id!=

(n+1)/

2);return ans;

}else

else

if(i < la) ans = a[i++];

else

if(j < lb) ans = b[j++];

id++;if

(id==n/

2||id==n/2+

1)}while

(id!=n/2+

1);return sum /2;

}}};

更普遍而言,我們考慮尋找兩個有序陣列中的第k小的數字。既然是兩個陣列,第乙個陣列中的第k

2\frac

2k​個數字必然大於第乙個陣列中前面第k2−

1\frac-1

2k​−

1個數字,第二個陣列中的第k

2\frac

2k​個數字必然大於第二個陣列中的前面第k2−

1\frac-1

2k​−

1個數字;這二者中最小的數字,最多也只能是大於了前面第k2−

1+k2

−1=k

−2

\frac-1+\frac-1=k-2

2k​−1+

2k​−

1=k−

2個數字(為什麼是「最多」呢,因為很有可能這個數字比另一組數字中的前k2−

1\frac-1

2k​−

1個數字都要小),不會是第k

kk小的數字了,需要從該數字後面進行下一次二分查詢,同時也排除掉了k

2\frac

2k​個數字(如果該陣列中容量不足k

2\frac

2k​個,則會減少掉該陣列的總容量,我們記排除掉的數字為t

tt個),下次尋找的應該是第k−t

k-tk−

t小的數字了。思路清楚後,編寫**即可。

class

solution

else

}int

gettopk

(int k,

int m,

int n, vector<

int>

& nums1, vector<

int>

& nums2)

if(index2 == n)

if(k ==1)

mid_index1 =

min(index1 + k /2-

1, m-1)

; mid_index2 =

min(index2 + k /2-

1,n-1)

; nums_index1 = nums1[mid_index1]

; nums_index2 = nums2[mid_index2];if

(nums_index1 < nums_index2)

else}}

};

leetcode 4 尋找有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 n...

LeetCode 4 尋找兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...

LeetCode 4 尋找兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 nums2 3,...