阅读 66

LeetCode 刷题笔记 - 4. 寻找两个有序数组的中位数

难度:

困难

描述:

给定两个大小为mn的有序数组nums1nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为O(log(m + n))
你可以假设nums1nums2不会同时为空。

示例:

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… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


语言:

swift

解析:

这题我觉得一点也不难,求两个数组中位数,就先将两个数组合并,再排序就好咯。
因为第三题用了游标,所以这题顺便也选了快速排序。
快排原理不赘述,直接上代码。

代码如下:

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])
        }
    }
}
复制代码

总结

复习了一遍快速排序和递归算法。