首页 > 其他 > 详细

二分法

时间:2021-02-16 18:20:09      阅读:30      评论:0      收藏:0      [点我收藏+]

NC36 在两个长度相等的排序数组中找到上中位数

给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。上中位数:假设递增序列长度为n,若n为奇数,则上中位数为第n/2+1个数;否则为第n/2个数[要求]时间复杂度为O(logN),额外空间复杂度为O(1)
示例1

输入-[1,2,3,4],[3,4,5,6]

返回值-3

说明-总共有8个数,上中位数是第4小的数,所以返回3。 

示例2

输入-[0,1,2],[3,4,5]

返回值-2

说明-总共有6个数,那么上中位数是第3小的数,所以返回2

看到时间复杂度为O(logN),很容易想到二分查找。过程如下:

  1. 如果每个数组中只有一个元素,较小的那个元素就是整体的上中位数,如果两个元素相等,随便返回哪个都可以。

  2. 如果数组中不止一个元素,找到两个数组的中间位置mid1和mid2。

  3. 如果arr1[mid1] == arr2[mid2],不管每个数组中元素的个数是奇数还是偶数,这两个数都可以是整体的上中位数,返回其中一个就可以。

  4. 如果arr1[mid1] > arr2[mid2],每个数组的个数是奇数的情况下:数组arr1中mid1位置以后的数都不可能是整体的上中位数,数组arr2中mid2位置以前的数都不可能是整体的上中位数。所以现在只需要考虑arr1[left1…mid1]、arr2[mid2…right],这两部分的元素个数相同,它们的上中位数就是整体的上中位数。

  5. 如果arr1[mid1] > arr2[mid2],每个数组的个数是偶数的情况下:数组arr1中mid1位置以后的数都不可能是整体的上中位数,数组arr2中mid2位置以后包括mid2位置,都不可能是整体的上中位数。所以现在只需要考虑arr1[left1…mid1]、arr2[mid2+1…right],这两部分的元素个数相同,它们的上中位数就是整体的上中位数。

  6. arr1[mid1] < arr2[mid2]的情况,分析同上。

技术分享图片
 1 #
 2 # find median in two sorted array
 3 # @param arr1 int整型一维数组 the array1
 4 # @param arr2 int整型一维数组 the array2
 5 # @return int整型
 6 #
 7 class Solution:
 8     def findMedianinTwoSortedAray(self , arr1 , arr2 ):
 9         # write code here
10 #         if not arr1:
11             
12         arr1_len = len(arr1)
13         left1, right1 = 0, arr1_len - 1
14         left2, right2 = 0, arr1_len -1
15         
16         
17         while left1 < right1:
18             mid1 = (left1 + right1) // 2
19             mid2 = (left2 + right2) // 2
20             
21             k = right1 - left1 + 1
22             
23             if arr1[mid1] == arr2[mid2]:
24                 return arr1[mid1]
25                     
26             elif arr1[mid1] < arr2[mid2]:
27                 if k % 2 == 0:
28                     left1 = mid1 + 1
29                     right2 = mid2
30                 else:
31                     left1 = mid1
32                     right2 = mid2
33                     
34             elif arr1[mid1] > arr2[mid2]:
35                 if k % 2 == 0:
36                     right1 = mid1
37                     left2 = mid2 + 1
38                 else:
39                     right1 = mid1
40                     left2 = mid2
41                     
42         return min(arr1[left1], arr2[left2])
43                 
View Code

 

二分法

原文:https://www.cnblogs.com/dede-0119/p/14405480.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!