4. 尋找兩個正序數(shù)組的中位數(shù)
難度困難3569
給定兩個大小為 m 和 n 的正序(從小到大)數(shù)組 nums1
和 nums2
开镣。請你找出并返回這兩個正序數(shù)組的中位數(shù)收津。
進階:你能設計一個時間復雜度為 O(log (m+n))
的算法解決此問題嗎忆某?
示例 1:
輸入:nums1 = [1,3], nums2 = [2]
輸出:2.00000
解釋:合并數(shù)組 = [1,2,3] 碗硬,中位數(shù) 2
示例 2:
輸入:nums1 = [1,2], nums2 = [3,4]
輸出:2.50000
解釋:合并數(shù)組 = [1,2,3,4] 沿癞,中位數(shù) (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
-10<sup>6</sup> <= nums1[i], nums2[i] <= 10<sup>6</sup>
My solution(歸并法)
import java.util.Arrays;
public class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int[] arr=new int[nums1.length+nums2.length];
for(int i=0;i<nums1.length;i++)
arr[i]=nums1[i];
for (int i =0;i<nums2.length;i++)
arr[i+nums1.length]=nums2[i];
Arrays.sort(arr);
return arr.length%2==1?arr[(arr.length-1)/2]:(arr[arr.length/2]+arr[arr.length/2-1])/2.0;
}
}
執(zhí)行用時:5 ms, 在所有 Java 提交中擊敗了14.05%的用戶
內存消耗:39.6 MB, 在所有 Java 提交中擊敗了81.65%的用戶
關于Arrays的sort方法,這里有一篇文章詳細介紹了它使用的算法https://www.cnblogs.com/baichunyu/p/11935995.html
我的解法肯定達不到題目要求的時間復雜度O(logn)擅腰,一般出現(xiàn)這樣的對數(shù)時間復雜度叠蝇,都是用到了二分查找法:
二分查找
public class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int n=nums1.length+nums2.length;
if(n%2==1)//和為奇數(shù),返回第n/2+1個數(shù)
return getMid(nums1,nums2,n/2+1);
if(n%2==0)//和為偶數(shù)铸鹰,返回第n/2個數(shù)和第n/2+1個數(shù)的和的一半
return (getMid(nums1,nums2,n/2)+getMid(nums1,nums2,n/2+1))/2.0;
else
return 0;
}
public double getMid(int[] nums1, int[] nums2,int k){
//返回第k個數(shù)
int start1=0,start2=0;
while(true){
if(start1==nums1.length)
return nums2[start2+k-1];
if(start2==nums2.length)
return nums1[start1+k-1];
if(k==1)
return Math.min(nums1[start1],nums2[start2]);
int index1=Math.min(start1+k/2-1,nums1.length-1);
int index2=Math.min(start2+k/2-1,nums2.length-1);
if(nums1[index1]<=nums2[index2])
{
k-=index1-start1+1;
start1=index1+1;
}
else
{
k-=index2-start2+1;
start2=index2+1;
}
}
}
}
該代碼是leetcode官方二分法解答的簡化版癌别,其主要就是定義了一個函數(shù),運用二分法獲取兩個數(shù)組中從小到大第k個元素
其中start1蹋笼,start2分別代表數(shù)組的起始指針展姐,初始值為0,都指向第一個元素剖毯;
進入循環(huán)后圾笨,首先判斷起始指針是否已經(jīng)到數(shù)組的最后,如果是逊谋,表示其中一個數(shù)組已經(jīng)判斷完了擂达,只需返回剩余數(shù)組的第k個元素即為結果
如果k=1,這時兩個數(shù)組都還沒有判斷完涣狗,這時只需返回剩余數(shù)組的最小元素(第一個)谍婉,即兩個數(shù)組第一個元素的最小值舒憾;
主要部分:
首先獲取接下來需要判斷的index,這個index不能超過數(shù)組的最大值穗熬,所以需要判斷一下镀迂,相應的k也就不能直接寫成k-=k/2,因為判斷完舍去的元素個數(shù)不一定為k/2唤蔗,新的起始指針設為index+1探遵,因為判斷完后,連位置為index的元素也一并舍去了妓柜,所以需要從下一個元素開始判斷
具體的原理可以直接看下面的鏈接
時間復雜度為O(logn)的算法要先考慮二分法箱季,這種方法復雜的地方就在于奇偶判斷這部分,建議畫圖棍掐,舉例解決
作者:LeetCode-Solution
鏈接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-s-114/