¥ java leetcode ¥寻找两个有序数组的中位数

在这里插入图片描述

	/**
	 * 不使用递归的二分查找
	 *title:commonBinarySearch
	 *@param arr
	 *@param key
	 *@return 关键字位置
	 */
	public static int commonBinarySearch(int[] arr,int key){
		int low = 0;
		int high = arr.length - 1;
		int middle = 0;			//定义middle
		
		if(key < arr[low] || key > arr[high] || low > high){
			return -1;				
		}
		
		while(low <= high){
			middle = (low + high) / 2;
			if(arr[middle] > key){
				//比关键字大则关键字在左区域
				high = middle - 1;
			}else if(arr[middle] < key){
				//比关键字小则关键字在右区域
				low = middle + 1;
			}else{
				return middle;
			}
		}
		
		return -1;		//最后仍然没有找到,则返回-1
	}
class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        #找到nums1和nums2固定范围内的第t小的数,left1、right1、left2、right2为nums1和nums2的范围。
        def find(left1,right1,left2,right2,t): 
            if left1 > right1: #此时其中一个数组已经无用,返回另一个数组的第t即可
                return nums2[left2+t-1]
            elif left2 > right2: #此时其中一个数组已经无用,返回另一个数组的第t即可
                return nums1[left1+t-1]
            if t == 1: #两数组都存在的递归结束条件,找最小的一个数
                return min(nums1[left1],nums2[left2])
            numm = t//2 #二分,向下取整,最多为t的一半
            #处理其中一个数组范围不足numm的情况,length表示判断之后丢弃的数的个数
            length1 = min(numm,right1-left1+1) 
            length2 = min(numm,right2-left2+1)
            #判断left+length-1的两个元素大小,调整两个数组的范围以及第几小元素,进行递归
            if nums1[left1+length1-1] <= nums2[left2+length2-1]:
                return find(left1+length1,right1,left2,right2,t-length1)
            else:
                return find(left1,right1,left2+length2,right2,t-length2)       
        m = len(nums1)
        n = len(nums2)
        #初始判断,处理其中有一个为空的情况
        if m == 0:
            if n%2 == 0:
                return float((nums2[n//2]+nums2[(n//2)-1])/2)
            else:
                return float(nums2[n//2])
        if n == 0:
            if m%2 == 0:
                return float((nums1[m//2]+nums1[(m//2)-1])/2)
            else:
                return float(nums1[m//2])
        ans = 0.0
        #分两种情况讨论返回
        if (m + n)%2 == 1:
            k = (m+n+1)//2
            ans = float(find(0,m-1,0,n-1,k))
        else:
            k = (m+n)//2
            ans = (float(find(0,m-1,0,n-1,k)) + float(find(0,m-1,0,n-1,k+1)))/2
        return ans

在这里插入图片描述
参考
https://zhuanlan.zhihu.com/p/143240662?from_voters_page=true

猜你喜欢

转载自blog.csdn.net/qq_41557627/article/details/114108511
今日推荐