最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Python尋找兩個有序數(shù)組的中位數(shù)實例詳解-創(chuàng)新互聯(lián)

Python尋找兩個有序數(shù)組的中位數(shù)

成都創(chuàng)新互聯(lián)公司是專業(yè)的瑪沁網(wǎng)站建設公司,瑪沁接單;提供成都網(wǎng)站制作、網(wǎng)站建設、外貿(mào)網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行瑪沁網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

審題:

1.找出意味著這是一個查找算法題

2.算法復雜度log級別,就是提示你是二分查找

3.二分查找實現(xiàn)一般為遞歸

 (1)遞歸包括遞歸體
 (2)終止條件

思路:

定理:

1.有序數(shù)組中有一半的元素小于等于數(shù)組的中位數(shù),有一半的元素大于等于中位數(shù)(如果數(shù)組中元素個數(shù)是奇數(shù),那么這里的一半并不是嚴格意義的1/2)


2.如果我們?nèi)サ羝渲幸粋€數(shù)組比中位數(shù)小的k個數(shù),再去掉另一個數(shù)組中比中位數(shù)大的k個數(shù),得到的合并子數(shù)組的中位數(shù)和原來的中位數(shù)相同。


eg:[1,2,3],[1,2,3] => [1,1,2,2,3,3]


根據(jù)定理去除元素[2,3],[1,2] => [1,2,2,3]中位數(shù)沒變。我用了特殊的例子解釋,你可以自行換一個試一試。如果兩個的數(shù)組長度不一樣的時候,不能去掉各自的一半,要去掉相同的個數(shù),下面會細說

解題思路:

假設兩個數(shù)組的中位數(shù)分別是a[m1],b[m2]


1.if a[m1] == b[m2] ,那么剛好有一半的元素小于a[m1],那么a[m1]就是要找的中位數(shù)。參考上面的列子


2.if a[m1] < b[m2],根據(jù)定理1可知,這個中位數(shù)只可能出現(xiàn)在a[n1/2 ~ n1-1]或者b[0 ~ n2/2].也就是說合并這兩個數(shù)組的中位數(shù)和原來的數(shù)組合并的數(shù)組的中位數(shù)是一樣的。 根據(jù)定理2可知:


1.數(shù)組長度一樣的時候,去除掉一半是合理的。


2.數(shù)組長度不一樣,這么做中位數(shù)可能發(fā)生變化。解決方案就是去除掉相同個數(shù)的元素。why?假設n1 < n2, 兩個數(shù)組就去掉n1/2個元素。那就不在是上面的范圍(a[n1/2 ~ n1-1]或者b[0 ~ n2/2]),而是a[n1/2 ~ n1-1]或者b[0 ~ (-n1/2+n2-1)].


結(jié)論就是:只能刪除a的n1/2(向下取整)

3.if a[m1] > b[m2],和上面分析類似,中位數(shù)只能出現(xiàn)在a的前半段或者b的后半段。也就是說a[0 ~ n1/2]和b[n1/2 ~ n2-1]的中位數(shù)和原來的中位數(shù)相同。

參考:LeetCode參考答案

class Solution:
  def findMedianSortedArrays(self, nums1, nums2):
    """
    :type nums1: List[int]
    :type nums2: List[int]
    :rtype: float
    """
    m, n = len(nums1), len(nums2)
    if m > n:
      nums1, nums2, m, n = nums2, nums1, n, m
    if n == 0:
      raise ValueError
    imin, imax, half_len = 0, m, (m + n + 1) // 2
    while imin <= imax:
      i = (imin + imax) // 2
      j = half_len - i
      if i < m and nums2[j-1] > nums1[i]:
        # i is too small, must increase it
        imin = i + 1
      elif i > 0 and nums1[i-1] > nums2[j]:
        # i is too big, must decrease it
        imax = i - 1
      else:
        # i is perfect
        if i == 0: max_of_left = nums2[j-1]
        elif j == 0: max_of_left = nums1[i-1]
        else: max_of_left = max(nums1[i-1], nums2[j-1])
        if (m + n) % 2 == 1:
          return max_of_left
        if i == m: min_of_right = nums2[j]
        elif j == n: min_of_right = nums1[i]
        else: min_of_right = min(nums1[i], nums2[j])
        return (max_of_left + min_of_right) / 2.0

當前題目:Python尋找兩個有序數(shù)組的中位數(shù)實例詳解-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://fisionsoft.com.cn/article/hpdpj.html