題目的輸入為兩組已經排序過的陣列(由小到大),而我們的目標就是回傳中間值。
- 若陣列的總長度為奇數,則回傳中央的值
- 若陣列的總長度為偶數,則回傳中央兩值加總的平均
時間複雜度: O(1)
空間複雜度: O(1)
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
nums1+=nums2
nums1.sort()
med=nums1[(len(nums1)-1)//2]
if len(nums1)%2==1: #陣列的總長度為奇數
return med
else: #陣列的總長度為偶數
l=nums1[(len(nums1)-1)//2]
r=nums1[((len(nums1)-1)//2)+1]
return (l+r)/2 #中央兩值加總的平均
C++
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
const int n1 = nums1.size();
const int n2 = nums2.size();
#保證n1大於n2
if (n1 > n2) return findMedianSortedArrays(nums2, nums1);
# 中位數
const int k = (n1 + n2 + 1) / 2;
int l = 0;
int r = n1;
# 遞歸
while (l < r) {
const int m1 = l + (r - l) / 2; # m1長度
const int m2 = k - m1; # m2長度
if (nums1[m1] < nums2[m2 - 1]) # m1 數組數量太少
l = m1 + 1;
else # m2 數組數量太少
r = m1;
}
const int m1 = l;
const int m2 = k - l;
#m1 <= 0 第一個數組沒使用
const int c1 = max(m1 <= 0 ? INT_MIN : nums1[m1 - 1],
m2 <= 0 ? INT_MIN : nums2[m2 - 1]);
#奇數
if ((n1 + n2) % 2 == 1)
return c1;
#右中位數
const int c2 = min(m1 >= n1 ? INT_MAX : nums1[m1],
m2 >= n2 ? INT_MAX : nums2[m2]);
return (c1 + c2) * 0.5;
}
};