困難算法
給定兩個大小爲
m
和n
的有序數組nums1
和nums2
。 請你找出這兩個有序數組的中位數,而且要求算法的時間複雜度爲O(log(m + n))
。
你能夠假設nums1
和nums2
不會同時爲空。swift
1:
nums1 = [1, 3]
nums2 = [2]
則中位數是 2.0
複製代碼
2:
nums1 = [1, 2]
nums2 = [3, 4]
則中位數是 (2 + 3)/2 = 2.5
複製代碼
來源:力扣(LeetCode) 連接:leetcode-cn.com/problems/me… 著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。數組
swiftbash
這題我以爲一點也不難,求兩個數組中位數,就先將兩個數組合並,再排序就好咯。
由於第三題用了遊標,因此這題順便也選了快速排序。
快排原理不贅述,直接上代碼。網絡
代碼以下:ui
class Solution {
func sort(numbersArray: inout [Int], low: Int, high: Int) {
if low >= high {
return
}
var i = low, j = high
let key = numbersArray[i]
while i < j {
while i < j && numbersArray[j] >= key {
j -= 1
}
numbersArray[i] = numbersArray[j]
while i < j && numbersArray[i] <= key {
i += 1
}
numbersArray[j] = numbersArray[i]
}
numbersArray[i] = key
sort(numbersArray: &numbersArray, low: low, high: i - 1)
sort(numbersArray: &numbersArray, low: i + 1, high: high)
}
func findMedianSortedArrays(_ nums1: [Int], _ nums2: [Int]) -> Double {
var numbersArray = nums1 + nums2
sort(numbersArray: &numbersArray, low: 0, high: numbersArray.count - 1)
let index = numbersArray.count / 2;
if numbersArray.count % 2 == 0 {
return Double((numbersArray[index] + numbersArray[index - 1])) / 2.0
} else {
return Double(numbersArray[index])
}
}
}
複製代碼
複習了一遍快速排序和遞歸算法。spa