描述:
給定兩個大小為 m 和 n 的有序陣列nums1
和nums2
。
請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設nums1
和nums2
不會同時為空。
示例 1:
num1 = [1,3]
num2 = [2]
中位數為:2.0
示例 2:
num1 = [1,2]
num2 = [3,4]
中位數是:(2+3)/2 = 2.5
什麼是中位數?
答:中位數,又稱中點數,中值。中位數是按順序排列的一組資料中居於中間位置的數,即在這組資料中,有一半的資料比他大,有一半的資料比他小。
中位數的作用是什麼?
答:將乙個集合劃分為兩個長度相等的子集,其中乙個子集中的元素總是大於另乙個子集中的元素。
解法一:
思路:1)將兩個陣列合併為乙個陣列,並排序
2)陣列的最大下標除以2求餘
餘數為0時,陣列個數為奇數,中位數為最中間的數
反之,陣列個數為偶數,中位數為中間兩位數之和的一半
時間複雜度 o(m+n)
具體實現:
func findmediansortedarrays(_ nums1: [int], _ nums2: [int]) -> double else
}//根據下標找出中位數
if ((allarr.count-1)%2) == 0else
}
解法二:遞迴法
思路:將兩個陣列合併後的長度劃分為兩個等長長度,若是多了一位則多的一位位於右邊,分別去查詢到左右兩邊對應的k值。這兩個k值之和的一半即為所求的中位數,這種查詢方式歸類於二分查詢
m為第乙個陣列的長度,n為第二個陣列的長度
1)當m和n均為偶數時
左邊的k值 一般是陣列的最後乙個數
右邊的k值,一般是陣列的第乙個數
中位數為 兩個k值之和的一半
2)當m和n乙個為偶數,乙個為奇數時
m>n時,中位數為第乙個陣列的最後乙個數
m時間複雜度:o(log(m+n))
具體實現:
func findmediansortedarrays(_ nums1: [int], _ nums2: [int]) -> double
//尋找第k個元素
func findkth(_ nums1: [int], _ i : int, _ nums2: [int], _ j : int, _ k : int)->int
if (j>=nums2.count)
if k==1
//判斷以i為起始位置,第k/2個元素,是否在陣列內
let n = i+k/2-1
var midval1 : int!
if nint{
return a
二 Leetcode演算法尋找兩個有序陣列的中位數
1 題目 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。nums1 1,3 nums2 2 則中位數是 2.0 nums1 1,2 nums2...
尋找兩個有序陣列的中位數
尋找兩個有序陣列的中位數 user hihone date 2019 1 31 time 16 32 description 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 ...
尋找兩個有序陣列的中位數
思路 將兩個陣列排序,然後判斷陣列長度,長度為單數,則取二分之一處的數,否則取二分之一處和二分之一減一處的數之和除以2.var findmediansortedarrays function nums1,nums2 var mid math.floor arr.length 2 if arr.len...