解題思路:
整體思路是將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...