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
- 1029. Median (25)
- 1029. Median (25)-PAT
- 【PAT】1029. Median (25)
- 1029. Median (25)
- 1029. Median (25)
- PAT 1029. Median (25)
- 1029. Median (25)
- PAT 1029. Median (25)
- PAT 1029. Median (25)
- 1029. Median (25)
- 1029. Median (25)
- 1029. Median (25)
- 1029. Median (25)
- 1029. Median (25)
- 1029. Median (25)
- 1029. Median (25)
- pat 1029. Median (25)
- 1029. Median (25)
- 基数排序
- python和php的面向对象
- js子窗体与父窗体
- 桶排序
- 网络设备将网口切换到业务板以后为什么会报各种不正确的信息?
- 1029. Median (25)
- Unity编程笔录--Unity Android加密dll
- VS2010远程调试 (2)
- Struts2系统学习(15)Struts2校验框架基本原理分析
- 变长数据项排序
- Gym 100796K Profact
- 创建型模式:工厂方法模式(Factory Method)--分析优缺点
- 在Win7上安装VS2015 RC(候选发布版)失败完美解决方法
- java调度器(重试机制)实现