給定兩個大小為 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...