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

2021-10-08 08:52:08 字數 2099 閱讀 5163

解題思路:

整體思路是將a和b兩個陣列按照公升序合併,最終計算乙個有序陣列的中位數。此時,需要判斷下陣列長度的奇偶性。

code:

#include

class

solution

else}if

(nums2.

empty()

)else

}int l =0;

int i =

0, j =0;

int len_nums1 = nums1.

size()

;int len_nums2 = nums2.

size()

;// 將兩個陣列按照非降序合併成乙個陣列

int s = len_nums1 + len_nums2;

vector<

int>

nums_merge

(s,0);

while

(l !=

(len_nums1 + len_nums2)

)break;}

if(j == len_nums2)

break;}

if(nums1[i]

< nums2[j]

)else

}// 前面都是為了獲得合併後陣列的長度

if(l %2==

0)else}}

;

解題思路:分析 ver

sion

1version1

versio

n1的求解過程可知,我們不必等到把陣列a和b合併完成後再去找中位數的位置。通過兩個陣列的長度 m+n

m+nm+

n 可以知道合併後的陣列長度,是否可以寫乙個迴圈,當遍歷到了中位數的位置就將結果返回。方法是可以但對於奇數偶數的分類還是會較為麻煩,能否通過某種方式將奇數偶數統一起來。

假設合併後的陣列長度為 len

lenle

n。當 len

lenle

n 為奇數時,我們需要得到 len

/2len/2

len/

2 索引處的值,則需要遍歷的次數為 len

/2+1

len/2+1

len/2+

1;當 len

lenle

n 為偶數時,我們需要得到 len

/2−1

len/2-1

len/2−

1 和 len

/2len/2

len/

2 索引處的值,則依然需要遍歷 len

/2+1

len/2+1

len/2+

1 次。所以論遍歷的次數,不論奇偶都需要遍歷 len

/2+1

len/2+1

len/2+

1 次。

當 l en

lenle

n 為奇數時,返回中位數只需要返回最後一次遍歷的結果。當 len

lenle

n 為偶數時,則需要返回最後一次和倒數第二次的遍歷結果。這樣我們可以設 cur

curcu

r 和 pre

prepr

e 兩個變數用來分別記錄當前一次和緊挨著的上一次迴圈遍歷的結果,在每次迴圈開始時,先將 cur

curcu

r 的值賦給 pre

prepr

e ,這樣當迴圈到最後一次遍歷時,pre

prepr

e 得到 cur

curcu

r 的值,即倒數第二次遍歷的結果,隨後 cur

curcu

r 更新為最後一次的結果。

code:

class

solution

else}if

(len %2==

0)else}}

;

leetcode4 尋找兩個正序陣列的中位數

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

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

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

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

原題目 思路 如果某乙個陣列的長度為零,直接返回另外乙個陣列的中位數,否則 用雙指標法將兩個陣列合併為乙個陣列 o n m 然後返回該陣列的中位數。class solution else if n 0 else int count 0,i 0,j 0 vectors n m while iwhile...