寻找两个有序数组的第k小的数

方法一:归并两个有序数组,然后通过下表访问归并后的数组,即可获得第k小的数,时间复杂度为O(m+n)

方法二:利用二分查找的思想,时间复杂度为O(lg(m+n))


Java实现代码:

package leetcode;

import java.util.Arrays;

public class MiddleII {

	public static void main(String[] args)
	{
		int[] A={7,9,10,11};
		int[] B={1,4,5,6,8};
		
		Arrays.sort(A);
		Arrays.sort(B);
		
		System.out.println(findKthNum(A,B,5));
	}
	
	public static int findKthNum(int[] A,int[] B,int k)
	{
		return helpFind(A,B,0,0,k);
	}
	
	private static int helpFind(int[] A,int[] B,int start_a,int start_b,int k)
	{
		if(start_a==A.length)
		{
			return B[start_b+k-1];
		}
		else if(start_b==B.length)
		{
			return A[start_a+k-1];
		}
		else if(k==1)
		{
			return Math.min(A[start_a],B[start_b]);
		}
		else if(A.length-start_a>B.length-start_b)
		{
			return helpFind(B,A,start_b,start_a,k);
		}
		else
		{
			int p=Math.min(k/2,A.length-start_a);
			int q=k-p;
			if(A[start_a+p-1]>B[start_b+q-1])
			{
				return helpFind(A,B,start_a,start_b+q,k-q);
			}
			else if(A[start_a+p-1]


你可能感兴趣的:(算法)