二分查詢 尋找兩個有序陣列的中位數

2021-10-23 11:52:01 字數 1690 閱讀 2746

力扣---尋找兩個有序陣列的中位數,下面看一下題目

題目敘述

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。

請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。

你可以假設 nums1 和 nums2 不會同時為空。

示例 1:

nums1 = [1, 3]

nums2 = [2]

則中位數是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

則中位數是 (2 + 3)/2 = 2.5

給出**:

class solution 

//num2陣列為空

if (index2 == n)

//兩個陣列總共2個元素

if (k == 1)

// 正常情況

int newindex1 = min(index1 + k / 2 - 1, m - 1); //0+2,3 取2--2,0+1,3--取1--取3

int newindex2 = min(index2 + k / 2 - 1, n - 1); //0+2,8 取2---3+1,8 --取4--3

int pivot1 = nums1[newindex1];

int pivot2 = nums2[newindex2];

if (pivot1 <= pivot2)

else }}

double findmediansortedarrays(vector& nums1, vector& nums2)

else

}};

看到上面的解釋挺多的,只看也看不出啥,還是自己推敲一遍。例如有如下2個陣列

num1: 1 3 4 9

num2: 1 2 3 4 5 6 7 8 9

總和為13,則k=7

m = 4,n = 9,index1=0,index2=0

newindex1= min(0+7/2-1,4-1) = 2,newindex2 = min(0+7/2-1,9) = 2(newindex1相當於調位之後的下標,index1是遞增的下標)

pivot1=num1[2]  =4   , pivot2=num2[2]=3

4 > 3 , k -= 2-0+1 =  4 , index2 = 2 + 1 = 3(此時num1[2]是第6小的,但現在要找第7小的,只需要找到比num1[2]大1個的)

newindex1 = min(0+4/2-1,4-1) = 1 , newindex2 = min(3+4/2-1,9) = 4(這裡num2一下跳了2個位,因為是根據k值進行二分,不用每次跳乙個位,這樣減少遍歷個數)

pivot1 = num1[1] = 3 , pivot2 = num2[4] = 5

3 < 5  , k-=1-0+1=2 , index1 = 2

newindex1  = min(2+2/2-1,4-1) = 2 ,  newindex2 = min(3+2/2-1,9) = 3

pivot1 = num1[4] = 3 , pivot2 = num2[3] = 4

4 == 4 ,k-=2-2+1=1 ,然後取個4,k=0,則找到了。題目用k/2進行二分查詢,根據k/2選擇跳位比較,然後在慢慢縮小範圍。

leetcode題 尋找兩個有序陣列的中位數

成績不是很好,本身寫的也很亂,本文只是提供一種解題思路。要求兩有序陣列的中位數並不難,簡單粗暴的方法就是得到兩陣列合併後的新陣列,取其中位數即可,但是難度在於這個時間複雜度有限制,為 o log m n 一看這個log,那麼很容易想到二分查詢演算法什麼的,而本文的解題過程也正是按照二分的思路來的。通...

有序陣列中的二分查詢

最近看一些演算法題發現這些問題到最後落實到實現上都是程式設計基礎的體現,包括對基本的for,if,else,while等語句的理解程度,還有對迴圈遞迴的理解。所以還是得回歸最基本的演算法,現在去學習那些高深複雜的dp,kmp,紅黑樹未免有點好高騖遠。目前應該堅持基礎,打好基礎,畢竟不是cs科班出身。...

LeetCode 4 尋找兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...