1029. Median (25)

来源:互联网 发布:淘宝上买什么 编辑:程序博客网 时间:2024/06/05 15:51

1.这道题目与leetcode中的Median of Two Sorted Arrays相似,只是偶数情况取前一个,不用求平均

2.采用二分法进行查找

数组分为如下部分

{a[0],a[1],a[2],....a[i-1]  |   a[i],a[i+1],...a[m-1]}
{b[0],b[1],b[2],....b[j-1]  |   b[j],b[j+1],...b[n-1]}

然后根据a[i-1]与b[j]、a[i]与b[j-1]的大小,进行二分查找

3.注意边界条件,可以看代码的注释

//#include<string>//#include <iomanip>#include<vector>#include <algorithm>//#include<stack>#include<set>#include<queue>#include<map>//#include<unordered_set>//#include<unordered_map>//#include <sstream>//#include "func.h"//#include <list>#include<stdio.h>#include<iostream>#include<string>#include<memory.h>#include<limits.h>using namespace std;/*001 100001 1001 101 1001 102 20 302 10 202 30 403 10 20 303 40 50 604 10 20 30 704 40 50 60 803 10 20 304 40 50 60 802 3 40*//*{a[0],a[1],a[2],....a[i-1]  |   a[i],a[i+1],...a[m-1]}{b[0],b[1],b[2],....b[j-1]  |   b[j],b[j+1],...b[n-1]}*/int findMedianSortedArrays(int *nums1, int*nums2,int m,int n) {if (m>n) return findMedianSortedArrays(nums2, nums1,n,m);int minIdx = 0, maxIdx = m;//第一个数组的范围int i, j;//两个数组的下标int num1, num2;int mid = (m + n + 1) >> 1;//为什么+1while (minIdx <= maxIdx){i = (minIdx + maxIdx) >> 1;//取中间值j = mid - i;if (i<m && j>0 && nums2[j - 1] > nums1[i]) minIdx = i + 1;else if (i>0 && j<n && nums2[j] < nums1[i - 1]) maxIdx = i - 1;else{if (i == 0) num1 = nums2[j - 1];else if (j == 0) num1 = nums1[i - 1];else num1 = max(nums1[i - 1], nums2[j - 1]);break;}}return num1;}int main(void){int m, n;scanf("%d", &m);int *nums1 = new int[m];for (int i = 0; i < m; i++){scanf("%d", &nums1[i]);}scanf("%d", &n);int *nums2 = new int[n];for (int i = 0; i < n; i++){scanf("%d", &nums2[i]);}//cout << findMedianSortedArrays(nums1, nums2, m, n) << endl;int *a, *b;if (m > n){a = nums2;b = nums1;swap(m, n);}else{a = nums1;b = nums2;}/*{a[0],a[1],a[2],....a[i-1]  |   a[i],a[i+1],...a[m-1]}{b[0],b[1],b[2],....b[j-1]  |   b[j],b[j+1],...b[n-1]}*/int ans = INT_MIN;bool getAns = false;int l = 0, r = m;//必须是r=m,数组a是长度较小的一个,假如长度为0,那么m-1=-1,下面会直接出错int i = (l + r) / 2;int j = (m + n + 1) / 2 - i;while (l <= r)//同理,假如m==0,至少确保循环执行了一次{i = (l + r) / 2;//假如m为0,i为0j = (m + n + 1) / 2 - i;//+1很重要if (i > 0 && j<n && a[i - 1]>b[j])r = i - 1;else if (j > 0 && i<m && b[j - 1]>a[i])l = i + 1;else{if (i == 0)ans = b[j - 1];else if (j == 0)ans = a[i - 1];elseans = max(a[i - 1], b[j - 1]);break;}}cout << ans << endl;return 0;}


0 0
原创粉丝点击