/**
* 不使用递归的二分查找
*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