swift演算法 尋找兩個有序陣列中的中位數

2021-09-21 13:14:27 字數 1549 閱讀 8601

描述:

給定兩個大小為 m 和 n 的有序陣列nums1nums2

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

你可以假設nums1nums2不會同時為空。

示例 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...