1. 程式人生 > 其它 >遞迴展開陣列物件,根據主鍵遞迴查詢樹形資料中對應的資料

遞迴展開陣列物件,根據主鍵遞迴查詢樹形資料中對應的資料

技術標籤:隨記題解

給定兩個大小為 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]

輸出:0.00000
示例 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),再到二分