国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

LeetCoder_____Median of Two Sorted Arrays

2019-11-08 01:45:41
字體:
來源:轉載
供稿:網友

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)).

Example 1:

nums1 = [1, 3]nums2 = [2]The median is 2.0

Example 2:

nums1 = [1, 2]nums2 = [3, 4]The median is (2 + 3)/2 = 2.5

題意:

給出兩個遞增序列,求該兩個遞增序列合并后的中位數。

我的答案:

第一次做的時候,其實跟最佳答案很相近了。

對左邊數組進行二分,找到二分位置的數字,然后用二分查找到右邊數組查找這個數字的位置,然后判斷兩邊元素個數是否相等。

最佳答案:

為了做這道題,我們需要去理解“中位數”. 在統計中, 在統計,中位數是用來將一組分成兩個相等的長度子集,

其中一個子集每個元素總是大于等于另一個子集元素。如果我們理解的使用值劃分,我們非常接近答案。

首先我讓A根據一個隨機位置i來分成兩個部分。

      left_A             |        right_AA[0], A[1], ..., A[i-1]  |  A[i], A[i+1], ..., A[m-1]

因為有m個元素,所以有m + 1種(i = 0 ~ m)。我們知道:len(left_A)=i,len(right_A)= m - i。

注意:當i= 0,left_A是空的,當i= m,right_A是空的。

同樣的方法,我讓B根據一個隨機位置j來分成兩個部分

      left_B             |        right_BB[0], B[1], ..., B[j-1]  |  B[j], B[j+1], ..., B[n-1]

把left_A,left_B為一組,把right_A,right_B到另一組,我們的名字他們left_part,right_part:

      left_part          |        right_partA[0], A[1], ..., A[i-1]  |  A[i], A[i+1], ..., A[m-1]B[0], B[1], ..., B[j-1]  |  B[j], B[j+1], ..., B[n-1]

如果我們可以保證:

1) len(left_part) == len(right_part)2) max(left_part) <= min(right_part)

然后我們把所有元素以同樣的長度分成兩個部分進入left_part,right_part,然后其中一個part始終要大于等于另一個。

然后,median = (max(left_part) + min(right_part))/2.

為了確保這兩個條件,我們只需要確保:

(1) i + j == m - i + n - j (or: m - i + n - j + 1)    if n >= m, we just need to set: i = 0 ~ m, j = (m + n + 1)/2 - i(2) B[j-1] <= A[i] and A[i-1] <= B[j]

細節不予多說了。

注意:part存在空集的情況。

代碼:

class Solution {public:    double findMedianSortedArrays(vector<int> nums1, vector<int> nums2) {        int num = (nums1.size() + nums2.size() + 1) / 2;        if(nums1.size() > nums2.size()) nums1.swap(nums2);        if(nums1.size() == 0 && nums2.size() == 1) return nums2[0];        int num1 = nums1.size(),num2 = nums2.size();        int l = 0,r = nums1.size(),mid;        int mx,mi;        while(l<=r)        {            mid = (l+r)/2;            int rest = num - mid;            if(rest < 0){                r = mid - 1;continue;            }else if(rest > num2){                l = mid + 1;continue;            }            if(mid != 0 && rest == 0) mx = nums1[mid-1];            else if(mid == 0 && rest != 0) mx = nums2[rest-1];            else mx = max(nums1[mid-1],nums2[rest-1]);            if(mid != num1 && rest == num2) mi = nums1[mid];            else if(mid == num1 && rest != num2) mi = nums2[rest];            else mi = min(nums1[mid],nums2[rest]);            if(mx <= mi){                l = mid;                break ;            }            if(mid == 0){                l = mid + 1;            }else if(rest == 0){                r = mid - 1;            }else{                if(mx == nums1[mid-1])                    r = mid - 1;                else                    l = mid + 1;            }        }        if((num1+num2)%2){            return mx;        }else{            return (mi+mx)/2.0;        }    }};


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 容城县| 方正县| 滦平县| 保康县| 瑞丽市| 迭部县| 定襄县| 鱼台县| 闽侯县| 武清区| 黄平县| 河西区| 宁陕县| 浦江县| 凤庆县| 安溪县| 芜湖市| 遂昌县| 江津市| 西乌| 漳州市| 五常市| 文登市| 巫溪县| 平舆县| 岳阳县| 龙岩市| 凯里市| 桃江县| 松桃| 田东县| 宝清县| 城口县| 曲麻莱县| 福泉市| 哈巴河县| 新干县| 淮安市| 土默特右旗| 和林格尔县| 保定市|