可惜没如果=_=
时光的河入海流

题目链接在这里:4. 寻找两个正序数组的中位数 - 力扣(LeetCode)

是一道很好的二分题,一开始没有想到越界怎么处理,忽略了(m+n)/2一定介于min(n,m)和max(n,m)之间,因此如果确定在短的数组上进行二分就不用考虑越界问题了,其次没有考虑到当划分之后,左边区间的每一个点都小于右边区间的点,这是一个很重要的性质,但是最开始在当前策略有效性的判断上并没有考虑到这个,而是单独的对每一个数组的边界分别进行判断。

 1 class Solution(object):
 2     def findMedianSortedArrays(self, nums1, nums2) -> float:
 3         n1 = len(nums1)
 4         n2 = len(nums2)
 5         m = (n1 + n2+1) // 2
 6         if n1 > n2:
 7             return Solution.findMedianSortedArrays(self, nums2, nums1)
 8         low, high = 0, n1
 9         while low <= high:
10             mid = (low + high) // 2
11             midd = m - mid
12 
13             # print("low:",low,"high:",high,"mid:",mid)
14             lw1 = -1e7 if mid == 0 else nums1[mid-1]
15             lw2 = -1e7 if midd == 0 else nums2[midd-1]
16             hgh = 1e7 if mid == n1 else nums1[mid]
17             hgh2 = 1e7 if midd == n2 else nums2[midd]
18 
19             if lw1<=hgh2:
20                 low = mid+1
21                 an1,an2 = max(lw1,lw2),min(hgh,hgh2)
22                 # print (lw1, lw2)
23             else:
24                 high = mid - 1
25         if ((n1+n2)%2==1):
26             return an1
27         else:
28             return (an1+an2)/2.0
29 
30 
31 if __name__ == "__main__":
32     nums1 = [1, 2]
33     nums2 = [3, 4]
34     ans = Solution.findMedianSortedArrays(self=0, nums1=nums1, nums2=nums2)
35     print(ans)

 

posted on 2023-03-20 16:32  珍珠鸟  阅读(7)  评论(0编辑  收藏  举报