二分查找——Median of two Sorted Arrays
2016-07-22 11:36
387 查看
本题为在两个排序数组中找第K大的数的一个特殊情况——第(A.length+B.length)/2大的数。
使用并归的思想逐个比较找出满足要求的数的时间复杂度为O(N)。
使用二分法比较A[K/2-1]和B[K/2-1],并思考这两个元素和第k大元素的关系。
1.A[K/2-1] <= B[K/2-1],A和B合并后的第K大数中必包含A[0]~A[k/2-1],可用归并的思想去理解。
2.若k/2-1超出了A的长度,则必取B[0]~B[k/2-1]。
接下来考虑特殊情况:
1.A,B都为空,或一个为空。
2.A+B的长度为偶数时返回len/2和len.2+1的均值,为奇数时返回len/2+1处的值。
3.findFunc利用了递归的方法,判断递归条件的判断非常重要:可以利用极端情况时的参数来入手,即看[ ]A.[ ]B,k谁先达到了极端的情况。
import java.util.*;
public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
if(A == null||B == null||(A.length == 0 && B.length == 0))
return 0;
int len=A.length+B.length;
if(len%2 == 0)
return (findFunc(A,B,0,0,len/2)+findFunc(A,B,0,0,len/2+1))/2.0;
else
return findFunc(A,B,0,0,len/2+1);
}
public int findFunc(int[] A,int[] B,int A_start,int B_start,int k)
{
if(A_start >= A.length)
return B[B_start+k-1];
if(B_start >= B.length)
return A[A_start+k-1];
if(1 == k)
return Math.min(A[A_start],B[B_start]);
int A_value=A_start+k/2-1 >= A.length?Integer.MAX_VALUE:A[A_start+k/2-1];
int B_value=B_start+k/2-1 >= B.length?Integer.MAX_VALUE:B[B_start+k/2-1];
if(A_value < B_value)
4000
return findFunc(A,B,A_start+k/2,B_start,k-k/2);
else
return findFunc(A,B,A_start,B_start+k/2,k-k/2);
}
}
使用并归的思想逐个比较找出满足要求的数的时间复杂度为O(N)。
使用二分法比较A[K/2-1]和B[K/2-1],并思考这两个元素和第k大元素的关系。
1.A[K/2-1] <= B[K/2-1],A和B合并后的第K大数中必包含A[0]~A[k/2-1],可用归并的思想去理解。
2.若k/2-1超出了A的长度,则必取B[0]~B[k/2-1]。
接下来考虑特殊情况:
1.A,B都为空,或一个为空。
2.A+B的长度为偶数时返回len/2和len.2+1的均值,为奇数时返回len/2+1处的值。
3.findFunc利用了递归的方法,判断递归条件的判断非常重要:可以利用极端情况时的参数来入手,即看[ ]A.[ ]B,k谁先达到了极端的情况。
import java.util.*;
public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
if(A == null||B == null||(A.length == 0 && B.length == 0))
return 0;
int len=A.length+B.length;
if(len%2 == 0)
return (findFunc(A,B,0,0,len/2)+findFunc(A,B,0,0,len/2+1))/2.0;
else
return findFunc(A,B,0,0,len/2+1);
}
public int findFunc(int[] A,int[] B,int A_start,int B_start,int k)
{
if(A_start >= A.length)
return B[B_start+k-1];
if(B_start >= B.length)
return A[A_start+k-1];
if(1 == k)
return Math.min(A[A_start],B[B_start]);
int A_value=A_start+k/2-1 >= A.length?Integer.MAX_VALUE:A[A_start+k/2-1];
int B_value=B_start+k/2-1 >= B.length?Integer.MAX_VALUE:B[B_start+k/2-1];
if(A_value < B_value)
4000
return findFunc(A,B,A_start+k/2,B_start,k-k/2);
else
return findFunc(A,B,A_start,B_start+k/2,k-k/2);
}
}
相关文章推荐
- 微信支付扫码支付php版
- 人群计数:Single-Image Crowd Counting via Multi-Column Convolutional Neural Network(CVPR2016)
- ROS(indigo)swarm_robot 群机器人示例Gazebo
- ROS(indigo)swarm_robot 群机器人示例Gazebo
- ROS(indigo)swarm_robot 群机器人示例Gazebo
- 互联网金融全面洗礼,民生电商金融基因凸显优势
- HDU 2529 Shot (物理题)
- WPS 下一层级级 快捷键
- 【HDU】5742 It's All In The Mind
- 关于yuv 格式-Semi Planar和Planar
- 对于android.intent.action.MAIN和android.intent.category.LAUNCHER的理解
- thrift远程调用示例
- 为什么找不到工作的是你,技术差的还是你?
- ubuntu下安装配置部署zabbix——mysql监控
- javascript 引用类型 - Array迭代
- 解决Android 5.0中出现的错误:Service Intent must be explicit
- 把图片保存到相册
- POJ 3669 Meteor Shower(BFS)
- 设置windows的默认调试器
- js实现url链接encode加密