遞迴展開陣列物件,根據主鍵遞迴查詢樹形資料中對應的資料
阿新 • • 發佈:2020-12-12
技術標籤:隨記題解
給定兩個大小為 m 和 n 的正序(從小到大)陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的中位數。
進階:你能設計一個時間複雜度為 O(log (m+n)) 的演算法解決此問題嗎?
示例 1:
輸入:nums1 = [1,3], nums2 = [2]
輸出:2.00000
解釋:合併陣列 = [1,2,3] ,中位數 2
示例 2:
輸入:nums1 = [1,2], nums2 = [3,4]
輸出:2.50000
解釋:合併陣列 = [1,2,3,4] ,中位數 (2 + 3) / 2 = 2.5
示例 3:
輸入:nums1 = [0,0], nums2 = [0,0]
示例 4:
輸入:nums1 = [], nums2 = [1]
輸出:1.00000
示例 5:
輸入:nums1 = [2], nums2 = []
輸出:2.00000
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
來源:力扣(LeetCode)
class Solution {
public:
double findMedianSortedArrays(vector< int>& nums1, vector<int>& nums2) {
if(nums1.size()>nums2.size()) return findMedianSortedArrays(nums2,nums1);
const int MIN=-1E10-5;
const int MAX=1E10+5;
int m=nums1.size(),n=nums2.size();
int i,j,l=0,r=m;
int min_num1,max_num1,min_num2, max_num2;
while(l<=r)
{
i=(l+r)/2;
j=(m+n+1)/2-i;
max_num1=i?nums1[i-1]:MIN;
max_num2=j?nums2[j-1]:MIN;
min_num1=i==m?MAX:nums1[i];
min_num2=j==n?MAX:nums2[j];
if(max_num1<=min_num2)
{
if(max_num2<=min_num1)
return (n+m)&1?max(max_num2,max_num1):(max(max_num2,max_num1)+min(min_num1,min_num2))/2.0;
l=i+1;
}
else r=i-1;
}
return (n+m)&1?max(max_num2,max_num1):(max(max_num2,max_num1)+min(min_num1,min_num2))/2.0;
}
};
這題其實就是一直優化下去你就會發現思路,一開始最蠢的O((m+n)²) 到發現是已經排序所以變成(m+n),再到二分