困难算法
给定两个大小为
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