Leetcode004--排序数组寻找第k个数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jinhuoxingkong/article/details/52622564


一、原题



There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the K a large number of locations of the two sorted arrays. The overall run time complexity should be O(log (m+n)). 



二、中文



给定两个排序数组,找到这两个排序数组中第k个大的数



三、举例



例如a[5] = {1, 2, 3, 4, 5}, b[5] = {4, 5, 6, 7, 8},当k=5的时候,最后返回的也就是这两数组整体排序后的第五个是数,也就是4



四、思路



(1)第一种方式是排序后再查找,时间复杂度是O(m+n),这种方法略过

(2)第二种是二分查找加递归的思想,首先查找到两个数组的中位数,然后通过中位数的比较,来缩小查找的空间,然后再通过全

体数的中位数的个数和k对比来确定最终的空间,进行递归,详细看代码。



五、程序



package LeetCode;

public class Leetcode004 {
	public static void main(String args[]){

		int a[] = {1, 2, 3, 4, 5};
		int b[] = {4, 5, 6, 7, 8};
		
		for(int i = 1; i <= 10; i++){	
			System.out.print(FindKthElm(a, 0, 4, b, 0, 4, i)+" ");
		}
		
	}
	
	//Notice : K > 0  
	public static int FindKthElm(int A[], int aBeg, int aEnd, int B[], int bBeg, int bEnd, int k)  
	{  
	    if (aBeg > aEnd)  
	    {  
	        return B[bBeg + k - 1];  
	    }  
	    if (bBeg > bEnd)  
	    {  
	        return A[aBeg + k - 1];  
	    }  
	      
	    //取中间位置  
	    int aMid = aBeg + (aEnd - aBeg)/2;    
	    int bMid = bBeg + (bEnd - bBeg)/2;  
	      
	    //从A和B的开始位置到两个数组中间位置的元素个数  
	    int halfLen = aMid - aBeg + bMid - bBeg + 2;  
	      
	    if (A[aMid] < B[bMid])  
	    {  
	        if (halfLen > k)  
	        {  
	            // 此时在合并的数组中A[aBeg...aMid]和元素一定在B[bMid]的左侧,  
	            // 即此时第k大的元素一定比B[bMid]这个元素小(严格来说不大于)  
	            // 故以后没有必要搜索 B[bMid...bEnd]这些元素  
	            return FindKthElm(A, aBeg, aEnd, B, bBeg, bMid - 1, k);  
	        }  
	        else  
	        {  
	            // 此时在合并的数组中A[aBeg...aMid]元素一定在B[bMid]的左侧,  
	            // 所以前K个元素中一定包含A[aBeg...aMid](可以使用反证法来证明这点)。  
	            // 但是无法判断A[amid+1...aEnd]与B[bBeg...bEnd]之间的关系,帮需要对他们进行判断  
	            // 此时K就剩下除去A[aBeg...aMid]这些元素,个数为k - (aMid - aBeg + 1)  
	            return FindKthElm(A, aMid + 1, aEnd, B, bBeg, bEnd, k - (aMid - aBeg + 1));  
	        }  
	    }  
	    else  
	    {  
	        //注释与上面相似  
	        if (halfLen > k)  
	        {  
	            return FindKthElm(A, aBeg, aMid - 1, B, bBeg, bEnd, k);  
	        }  
	        else  
	        {  
	            return FindKthElm(A, aBeg, aEnd, B, bMid + 1, bEnd, k - (bMid - bBeg + 1));  
	        }  
	    }  
	}  
}


-------------------------output--------------------------------


1 2 3 4 4 5 5 6 7 8 



阅读更多
换一批

没有更多推荐了,返回首页