摘要:最新解法及思路有兩個(gè)有序數(shù)組和,他們的大小各是和,請找出這兩個(gè)數(shù)組所有數(shù)的中位數(shù),總得時(shí)間復(fù)雜度不超過歸并計(jì)數(shù)法復(fù)雜度時(shí)間空間思路如果對時(shí)間復(fù)雜度沒有要求,這個(gè)方法是實(shí)現(xiàn)起來最簡單的,我們只需要從下往上依次數(shù)個(gè)元素即可。
Median of Two Sorted Arrays 最新解法及思路:https://yanjia.li/zh/2018/11/...
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).歸并計(jì)數(shù)法 Merge and Count 復(fù)雜度有兩個(gè)有序數(shù)組nums1和nums2,他們的大小各是m和n,請找出這兩個(gè)數(shù)組所有數(shù)的中位數(shù),總得時(shí)間復(fù)雜度不超過O(log(m+n))
時(shí)間O(n) 空間O(1)
思路如果對時(shí)間復(fù)雜度沒有要求,這個(gè)方法是實(shí)現(xiàn)起來最簡單的,我們只需要從下往上依次數(shù)(n+m)/2個(gè)元素即可。由于兩個(gè)數(shù)組都已經(jīng)排序,我們可以使用兩個(gè)指針指向數(shù)組“底部”,通過比較兩個(gè)數(shù)組“底部”的元素大小來決定計(jì)哪一個(gè)元素,同時(shí)將其所在數(shù)組的指針“向上”移一位。為了方便處理總元素為偶數(shù)的情況,這里將找中位數(shù)變成找第k小的元素。
注意計(jì)數(shù)的循環(huán)是用來找到第k-1個(gè)元素的,最后return的時(shí)候再判斷第k個(gè)元素是哪一個(gè)
在每次計(jì)數(shù)的循環(huán)中要先判斷兩個(gè)數(shù)組指針是否超界,在最后return之前也要判斷一次
代碼public class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int len1 = nums1.length; int len2 = nums2.length; int total = len1 + len2; if(total % 2==0){ return (findKth(nums1,nums2,total/2)+findKth(nums1,nums2,total/2+1))/2.0; } else { return findKth(nums1,nums2,total/2+1); } } private int findKth(int[] nums1, int[] nums2, int k){ int p = 0, q = 0; for(int i = 0; i < k - 1; i++){ if(p>=nums1.length && q分治法 Divide and Conquer 復(fù)雜度=nums2.length && p nums2[q]){ q++; } else { p++; } } if(p>=nums1.length) { return nums2[q]; } else if(q>=nums2.length) { return nums1[p]; } else { return Math.min(nums1[p],nums2[q]); } } }
時(shí)間O(log(m+n)) 空間O(1)
思路題目要求O(log(m+n))的時(shí)間復(fù)雜度,一般來說都是分治法或者二分搜索。首先我們先分析下題目,假設(shè)兩個(gè)有序序列共有n個(gè)元素(根據(jù)中位數(shù)的定義我們要分兩種情況考慮),當(dāng)n為奇數(shù)時(shí),搜尋第(n/2+1)個(gè)元素,當(dāng)n為偶數(shù)時(shí),搜尋第(n/2+1)和第(n/2)個(gè)元素,然后取他們的均值。進(jìn)一步的,我們可以把這題抽象為“搜索兩個(gè)有序序列的第k個(gè)元素”。如果我們解決了這個(gè)k元素問題,那中位數(shù)不過是k的取值不同罷了。
那如何搜索兩個(gè)有序序列中第k個(gè)元素呢,這里又有個(gè)技巧。假設(shè)序列都是從小到大排列,對于第一個(gè)序列中前p個(gè)元素和第二個(gè)序列中前q個(gè)元素,我們想要的最終結(jié)果是:p+q等于k-1,且一序列第p個(gè)元素和二序列第q個(gè)元素都小于總序列第k個(gè)元素。因?yàn)榭傂蛄兄?,必然有k-1個(gè)元素小于等于第k個(gè)元素。這樣第p+1個(gè)元素或者第q+1個(gè)元素就是我們要找的第k個(gè)元素。
所以,我們可以通過二分法將問題規(guī)??s小,假設(shè)p=k/2-1,則q=k-p-1,且p+q=k-1。如果第一個(gè)序列第p個(gè)元素小于第二個(gè)序列第q個(gè)元素,我們不確定二序列第q個(gè)元素是大了還是小了,但一序列的前p個(gè)元素肯定都小于目標(biāo),所以我們將第一個(gè)序列前p個(gè)元素全部拋棄,形成一個(gè)較短的新序列。然后,用新序列替代原先的第一個(gè)序列,再找其中的第k-p個(gè)元素(因?yàn)槲覀円呀?jīng)排除了p個(gè)元素,k需要更新為k-p),依次遞歸。同理,如果第一個(gè)序列第p個(gè)元素大于第二個(gè)序列第q個(gè)元素,我們則拋棄第二個(gè)序列的前q個(gè)元素。遞歸的終止條件有如下幾種:
較短序列所有元素都被拋棄,則返回較長序列的第k個(gè)元素(在數(shù)組中下標(biāo)是k-1)
一序列第p個(gè)元素等于二序列第q個(gè)元素,此時(shí)總序列第p+q=k-1個(gè)元素的后一個(gè)元素,也就是總序列的第k個(gè)元素
注意每次遞歸不僅要更新數(shù)組起始位置(起始位置之前的元素被拋棄),也要更新k的大?。鄢粧仐壍脑兀?/p> 代碼
public class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int m = nums1.length, n = nums2.length; int k = (m + n) / 2; if((m+n)%2==0){ return (findKth(nums1,nums2,0,0,m,n,k)+findKth(nums1,nums2,0,0,m,n,k+1))/2; } else { return findKth(nums1,nums2,0,0,m,n,k+1); } } private double findKth(int[] arr1, int[] arr2, int start1, int start2, int len1, int len2, int k){ // 保證arr1是較短的數(shù)組 if(len1>len2){ return findKth(arr2,arr1,start2,start1,len2,len1,k); } if(len1==0){ return arr2[start2 + k - 1]; } if(k==1){ return Math.min(arr1[start1],arr2[start2]); } int p1 = Math.min(k/2,len1) ; int p2 = k - p1; if(arr1[start1 + p1-1]arr2[start2 + p2-1]){ return findKth(arr1,arr2,start1,start2 + p2,len1,len2-p2,k-p2); } else { return arr1[start1 + p1-1]; } } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/64391.html
摘要:解法解法應(yīng)該是最常見的一種解法,就是將兩個(gè)數(shù)組頭尾相加合并起來,然后重新排序,例如輸入兩個(gè)數(shù)組,合并之后變?yōu)?,然后求出中位?shù)。如果兩個(gè)數(shù)組長度和為偶數(shù),那么中位數(shù)有兩個(gè),否則只有一個(gè) 題目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the tw...
摘要:復(fù)雜度思路因?yàn)橐抑形粩?shù),又是在兩個(gè)的數(shù)組里面。所以考慮用二分法。二分法經(jīng)常適合的接下來考慮如何二分。然后對和進(jìn)行比較,記為和。所以為了縮小搜索范圍,我們可以扔掉這些數(shù),在的剩下來的數(shù)中和的數(shù)組中接著找。說明中沒有個(gè)數(shù)可以尋找。 Leetcode[4] Median of two sorted arrays There are two sorted arrays nums1 and n...
摘要:自第一篇收集向的文章發(fā)布后,近年半沒更新這個(gè)專欄了。今天是分類中第一個(gè)的,叫做。不過這樣需要兩個(gè)數(shù)組各掃一遍,然而我們的目的只是要取到中間值,似乎并不用完整的掃一遍。那么也就意味著,我們最終要記錄的值可能是兩個(gè)。 大家好,我叫張小豬。 自第一篇收集向的文章發(fā)布后,近 1 年半沒更新這個(gè)專欄了。最近面試中發(fā)現(xiàn)將近 60% 的候選人對于 bubble sort 面露難色,于是心悸于自己也忘...
摘要:由于要求的時(shí)間,所以選擇二分法。思路是找到兩個(gè)數(shù)組合并起來的第個(gè)元素。這樣只需計(jì)算兩個(gè)數(shù)組的中位數(shù)是第幾個(gè)元素,代入功能函數(shù)即可。據(jù)此,根據(jù)二分法的性質(zhì),我們在遞歸時(shí)可以將前即個(gè)元素排除。 Problem There are two sorted arrays A and B of size m and n respectively. Find the median of the tw...
摘要:難度為這個(gè)題目描述很清晰給出兩個(gè)排序好的數(shù)組求這兩個(gè)數(shù)組的中位數(shù)在解這個(gè)題的過程中會碰到以下的問題先合起來重新排序是不可行的時(shí)間復(fù)雜度太高為先歸并排序也是不可行的時(shí)間復(fù)雜度為用類似桶排的方法時(shí)間復(fù)雜度為不可行可能會碰到多種全部大于或全部小于 There are two sorted arrays nums1 and nums2 of size m and n respectively...
閱讀 2515·2021-11-15 11:36
閱讀 1260·2019-08-30 15:56
閱讀 2313·2019-08-30 15:53
閱讀 1103·2019-08-30 15:44
閱讀 714·2019-08-30 14:13
閱讀 1052·2019-08-30 10:58
閱讀 542·2019-08-29 15:35
閱讀 1367·2019-08-29 13:58