多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > leetcode No4. Median of Two Sorted Arrays

leetcode No4. Median of Two Sorted Arrays

來源:程序員人生   發布時間:2016-11-11 08:21:03 閱讀次數:2417次

Question:

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

求兩個數組合并后的中位數

Algorithm:

中位數求法:把長度為k數組從小到大排列,返回中間位置的元素。
k為奇數,中位數為nums[k/2],k為偶數中位數為(nums[k/2]+nums[(k/2)⑴]/2
算法1:歸并兩個數組后,找中位數,復雜度O(m+n)
算法2:類似2分查找,不需要歸并,復雜度O(log(m+n))
現在詳細說明解法2,我們可以把問題轉化為尋覓第k大的元素
假定AB的長度都大于k/2,比較A[(k/2)⑴]和B[(k/2)⑴],有3種情況
1、A[k/2⑴] = B[k/2⑴]
此時,我們就已找到第k大的元素,即element=A[k/2⑴]=B[k/2⑴]
2、A[k/2⑴] < B[k/2⑴]
此時,意味著A[0]~A[k/2⑴]都比第k個元素小,由于A[0]~A[k/2⑴]有k/2個元素,B[0]~B[k/2⑴]有k/2個元素,如果A[k/2⑴]是比第k個元素還大的元素,假定A[k/2⑴]是比第k+1小的元素,那末B[k/2⑴]最少是第k+2大的元素。但是在A中最多有k/2⑴個元素小于A[k/2⑴],在B中最多有k/2⑴個元素小于A[k/2⑴],總共最多有(k/2⑴+k/2⑴)即k⑵個元素。所以A[k/2⑴]不可能大于第k個元素。所以我們可以刪去,然后找第k-k/2=k/2個元素。
3、A[k/2⑴] > B[k/2⑴]
類似2
在這里要注意3種特殊情況
1、如果AB有1個是空,則返回非空數組下標為k⑴的元素,即A[k⑴]或B[k⑴]
2、如果k==1,則返回min{A[0],B[0]}
3、如果k/2比短的數組長的話(假定是A),則比較A[m⑴]和B[k/2⑴]
Ex:
A{1,3,7,8}     m1=4
B{2,4,5,6,7,8,9,10,12}   m2=9
由于刪除元素較為麻煩,所以在程序中設兩個變量begin1,begin2作為起始元素。再設置m1和m2作為有效數組長度。
1、合并后的數組,長度為m1+m2=13,那末我們要找出第13/2+1=7,即k=7,第7大的元素。剛開始begin1和begin2都為0,m1=4,m2=9
2、A[begin1+k/2⑴]=A[2]=7 > B[begin2+k/2⑴]=B[2]=5,所以我們刪去B中的2,4,5,在程序中,我們可使begin2指針指向元素6,即begin2=3,m2=9⑶=6,現在我們要找出k⑶即第4大的元素
3、k=4,begin1=0,begin2=3,m1=4,m2=6,A[begin1+k/2⑴]=A[1]=3 < B[begin2+k/2⑴]=B[7],所以我們刪去A中1,3,begin1=0+2=2,m1=4⑵=2,現在我們要找出k⑵,即第2大的元素
4、k=2,begin1=2,begin2=3,m1=2,m2=6,A[begin1+k/2⑴]=A[2]=7 > B[begin2+k/2⑴]=B[3]=6,所以我們刪去B中6,begin2=3+1=4,m2=6⑴=5,現在我們要找出k⑴,即第1大的元素
5、k=1,begin1=2,begin2=4,m1=2,m2=5比較A[begin1]=A[2]=7,B[begin2]=B[4]=7,返回7,終究結果為7

Accepted Code:

算法1:
class Solution { public: vector<int> MergeSort(vector<int>& nums1, vector<int>& nums2) { vector<int> res; int i=0,j=0; while(i<nums1.size() && j<nums2.size()) { if(nums1[i]<=nums2[j]) { res.push_back(nums1[i]); i++; } else { res.push_back(nums2[j]); j++; } } while(i<nums1.size()) { res.push_back(nums1[i]); i++; } while(j<nums2.size()) { res.push_back(nums2[j]); j++; } return res; } double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { vector<int> temp=MergeSort(nums1,nums2); double res; int len=temp.size(); if(temp.size()%2==0) res=(double)(temp[len/2]+temp[(len/2)⑴])/2; else res=temp[len/2]; return res; } };


算法2:
class Solution { public: double find_kth(vector<int>& nums1,vector<int>& nums2,int m1,int m2,int k,int begin1,int begin2) { if(m1 > m2) return find_kth(nums2,nums1,m2,m1,k,begin2,begin1); if(m1 == 0) return nums2[k⑴]; if(k == 1) return nums1[begin1] < nums2[begin2]?nums1[begin1]:nums2[begin2]; int a=min(k/2,m1); //the ath element in A int b=k-a; //the bth element in B if(nums1[begin1+a⑴] < nums2[begin2+b⑴]) //compare the ath element in A and the bth element in B return find_kth(nums1,nums2,m1-a,m2,k-a,begin1+a,begin2); else return find_kth(nums1,nums2,m1,m2-b,k-b,begin1,begin2+b); } double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int m1=nums1.size(); int m2=nums2.size(); int k=(m1+m2)>>1; if((m1+m2)%2==1) return find_kth(nums1,nums2,m1,m2,k+1,0,0); else return (find_kth(nums1,nums2,m1,m2,k+1,0,0)+find_kth(nums1,nums2,m1,m2,k,0,0))/2; } };








生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日本久久久久一级毛片 | 国产在线精品福利91香蕉 | 久久久精品国产 | 亚洲国产精品乱码在线观看97 | 理论亚洲区美一区二区三区 | 爱爱视频日本 | 亚洲精品第一第二区 | 国产成人综合欧美精品久久 | 国内自拍视频在线看免费观看 | 久久伊人婷婷 | 国产嫩草影院精品免费网址 | 亚洲最新永久在线观看 | 日韩中文精品亚洲第三区 | babes性欧美高清 | 性久久久久久久久久 | 台湾成人性视频免费播放 | 两性午夜欧美高清做性 | 最近中文字幕mv免费视频 | 国产98在线 | 精品一区二区影院在线 | 亚洲一区二区免费视频 | 毛片亚洲毛片亚洲毛片 | 日本一区二区三区不卡视频中文字幕 | 欧美日韩大尺码免费专区 | 国产一区二区福利久久 | 日韩中文字幕高清在线专区 | 欧美性视频网站 | 精品国产福利在线观看网址2022 | freesex性欧美重口 | 亚洲激情在线播放 | 国产一区二 | 国产第一页精品 | 在线观看一区二区三区视频 | 99影视在线视频免费观看 | 亚洲精品在线免费观看视频 | 武则天级淫片a级中文 | 国产v综合v亚洲欧美 | 国产欧美成人免费观看视频 | 亚洲国产最新在线一区二区 | 国产精品久久久久激情影院 | 国产一级做a爱免费视频 |