Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4075883

Browse files
Create Median of Two Sorted Arrays
1 parent 8dae356 commit 4075883

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
想法:先選定較小的矩陣,然後用 binary search 找到合適的 partitionA 以及 partitionB
2+
使之符合 partitionA + partitionB = (m + n + 1) / 2
3+
切出 nums1[0 .. partitionA - 1] , nums2[0 .. partitionB - 1] 以及 nums1[partitionA .. m] , nums2[partitionB .. n]
4+
且 nums1[partitionA - 1] <= nums2[partitionB] and nums2[partitionB - 1] <= nums1[partitionA]
5+
這樣就代表剛好切到中線上,反之則依照大小關係向左向右推進
6+
7+
Time Complexity : O( log(min(m , n))) for binary searching on the smaller array
8+
Space Complexity : O(1) for variables
9+
10+
class Solution {
11+
public:
12+
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
13+
if ( nums1.size() > nums2.size() )
14+
swap(nums1 , nums2 ) ;
15+
16+
int m = nums1.size() , n = nums2.size() ;
17+
int l = 0 , r = m ;
18+
while (l <= r) {
19+
int partitionA = (l + r) / 2 ;
20+
int partitionB = (m + n + 1) / 2 - partitionA ;
21+
22+
int maxleftA = (partitionA == 0)? INT_MIN : nums1[partitionA - 1] ;
23+
int minrightA = (partitionA == m)? INT_MAX : nums1[partitionA] ;
24+
int maxleftB = (partitionB == 0)? INT_MIN : nums2[partitionB - 1] ;
25+
int minrightB = (partitionB == n)? INT_MAX : nums2[partitionB] ;
26+
27+
if ( maxleftA <= minrightB && maxleftB <= minrightA ) {
28+
// the cut is right
29+
if ( (m + n) % 2 == 0 ) {
30+
return (max(maxleftA,maxleftB)+min(minrightA,minrightB)) / 2.0;
31+
}
32+
else
33+
return max(maxleftA , maxleftB) ;
34+
}
35+
else if ( maxleftA > minrightB )
36+
r = partitionA - 1 ;
37+
else
38+
l = partitionA + 1 ;
39+
}
40+
return 0 ;
41+
}
42+
};

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /