LeetCode 4:Median of Two Sorted Arrays
2015-09-07 20:18
363 查看
博客转载请注明地址:
给出两个有序数组,求两个有序数组合并在一起的中位数是多少?
分类讨论
转换问题
1. 将题目求中位数转换成:在合并的数组中,找到第k小的数。
假设合并后的数组大小为n,arr表示合并后的数组
那么:
sum=(arr[(n+1)/2]+arr[(n+2)/2])/2.0sum = (arr[(n+1)/2] + arr[(n+2)/2]) / 2.0
枚举一下,就知道这个式子的正确性。
在合并后的数组中,中arr_1
不断缩小寻找区间
假设当前的寻找区间为([L1,R1],[L2,R2])([L_1,R_1],[L_2,R_2]),
mid1=(L1+R1)/2mid_1=(L_1+R_1)/2;
mid2=(L2+R2)/2mid_2=(L_2+R_2)/2;
maxNum=max(arr1[mid1],arr2[mid2])maxNum = max(arr_1[mid_1], arr_2[mid_2])
如果将这mid_1+mid_2个数字组合在一起
题目描述
题目地址:https://leetcode.com/problems/median-of-two-sorted-arrays/给出两个有序数组,求两个有序数组合并在一起的中位数是多少?
考察点
二分查找,分治分类讨论
思路
传统的二分查找在[L,R][L,R]区间求出满足条件的值。该题是一个举一反三,希望在区间([L1,R1],[L2,R2])([L_1,R_1],[L_2,R_2])查找出满足条件的值。转换问题
1. 将题目求中位数转换成:在合并的数组中,找到第k小的数。
假设合并后的数组大小为n,arr表示合并后的数组
那么:
sum=(arr[(n+1)/2]+arr[(n+2)/2])/2.0sum = (arr[(n+1)/2] + arr[(n+2)/2]) / 2.0
枚举一下,就知道这个式子的正确性。
在合并后的数组中,中arr_1
不断缩小寻找区间
假设当前的寻找区间为([L1,R1],[L2,R2])([L_1,R_1],[L_2,R_2]),
mid1=(L1+R1)/2mid_1=(L_1+R_1)/2;
mid2=(L2+R2)/2mid_2=(L_2+R_2)/2;
maxNum=max(arr1[mid1],arr2[mid2])maxNum = max(arr_1[mid_1], arr_2[mid_2])
如果将这mid_1+mid_2个数字组合在一起
Code
[code]class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int L[2], R[2], len[2]; int *arr[2]; int mid[2]; int mid_len[2]; int min_p, max_p; int dlt_len; double sum; len[0] = nums1.size(); len[1] = nums2.size(); arr[0] = new int[len[0] + 2]; arr[1] = new int[len[1] + 2]; for(int i = 1; i <= len[0]; i++) arr[0][i] = nums1[i-1]; for(int i = 1; i <= len[1]; i++) arr[1][i] = nums2[i-1]; mid_len[0] = (len[0] + len[1] + 1) >> 1; mid_len[1] = (len[0] + len[1] + 2) >> 1; if(!len[0] || !len[1]){ if(!(len[0]^len[1])) return 0.0; else return (arr[!len[0]][mid_len[0]] + arr[!len[0]][mid_len[1]] ) / 2.0; } L[0] = 0; R[0] = len[0]; L[1] = 0; R[1] = len[1]; arr[0][0] = arr[1][0] = min(arr[0][1], arr[1][1]); arr[0][len[0]+1] = arr[1][len[1]+1] = max(arr[0][len[0]], arr[1][len[1]]); while(true){ mid[0] = (L[0] + R[0]) >> 1; mid[1] = (L[1] + R[1]) >> 1; max_p = arr[1][mid[1]] >= arr[0][mid[0]]; min_p = !max_p; dlt_len = mid[0] + mid[1] - mid_len[0]; if(dlt_len == 0){ if(arr[min_p][mid[min_p]+1] >= arr[max_p][mid[max_p]]){ break; }else{ R[max_p] = mid[max_p] - 1; L[min_p] = mid[min_p] + 1; } }else if(dlt_len > 0){ R[max_p] = mid[max_p] - 1; }else{ // < 0 L[min_p] = mid[min_p]; min_p = !(arr[0][L[0] + 1] <= arr[1][L[1]+1]); L[min_p]++; } } sum = arr[max_p][mid[max_p]]; if(mid_len[0] != mid_len[1]){ sum += min(arr[0][mid[0]+1], arr[1][mid[1]+1]); sum /= 2; } return sum; } };
排名
相关文章推荐
- Qt 头文件、CONFIG
- 十个人过洞
- 【Android应用源码分析】android中HashMap的替代者——SparseArray 源码分析
- StringMethodDemo.java
- 熟悉linux-安装jdk
- 使用函数BBP_INB_DELIVERY_CREATE(VL31n)创建内向交货单时,交货单内的物料字段为空
- 单点登陆
- mac下安装MYSQL-python
- 函数指针
- 严重: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error cre
- LeetCode_populating-next-right-pointers-in-each-node
- StringBufferDemo
- 三种循环结构打印表
- Could not publish server configuration for Tomcat v6.0 Server at localhost
- Java集合类详解
- TCP/IP,http,socket,长连接,短连接——小结。
- eclipse调试java程序的九个技巧--有链接
- 标准C++中的string类的用法总结
- 小算法:一个排名区间,对应一个奖品,给定一个排名区间,判断它要领取奖品的id
- BFS最短路+状态dp(hdu3681)好