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

2021-09-12 08:54:58 字數 1071 閱讀 4345

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

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

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

nums1 = [1, 3]

nums2 = [2]

則中位數是 2.0

nums1 = [1, 2]

nums2 = [3, 4]

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

分析

通過兩個陣列元素總數(total)與十六進製制1(0x1)進行按位與計算,判斷total是奇數還是偶數。

假設a和b的元素個數都大雨k/2,將a的第k/2個元素(即a[k/2-1])和b的第k/2個元素(即b[k/2-1])進行比較:

如果a[k/2-1] < b[k/2-1],則a[0]到a[k/2-1]的元素肯定在topk元素範圍內,可以刪除a中的前k/2個元素;

如果a[k/2-1] > b[k/2-1],則b[0]到b[k/2-1]的元素肯定在topk元素範圍內,可以刪除b中的前k/2個元素;

如果a[k/2-1] == b[k/2-1],則找到第k大的元素,直接返回a[k/2-1]或b[k/2-1];

採用遞迴函式查詢第k大的元素,會有三種終止條件:

時間複雜度o(log(m+n)),空間複雜度o(log(m+n))

double findmediansortedarrays(vector& a, vector& b)  else 

}static int find_kth(std::vector::const_iterator a,int m,std::vector::const_iterator b,int n,int k)

if(m==0)

if(k==1)

int ia=min(k/2,m),ib=k-ia;

if(*(a+ia-1)<*(b+ib-1)) else if(*(a+ia-1)>*(b+ib-1)) else

}

LeetCode刷題之650 只有兩個鍵的鍵盤

我不知道將去向何方,但我已在路上!輸入 3 輸出 3 解釋 最初,我們只有乙個字元 a 第 1 步,我們使用 copy all 操作。第 2 步,我們使用 paste 操作來獲得 aa 第 3 步,我們使用 paste 操作來獲得 aaa class solution def minsteps se...

leetcode刷題 021合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 definition for singly linked list.class listnode def init self,x self.v...

leetcode刷題之旅 21 合併兩個有序鍊錶

definition for singly linked list.struct listnode listnode int x val x next nullptr listnode int x,listnode next val x next next class solution cur ne...