题目描述:
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。示例 1:输入:nums1 = [1,3], nums2 = [2]输出:2.00000解释:合并数组 = [1,2,3] ,中位数 2示例 2:输入:nums1 = [1,2], nums2 = [3,4]输出:2.50000解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5示例 3:输入:nums1 = [0,0], nums2 = [0,0]输出:0.00000示例 4:输入:nums1 = [], nums2 = [1]输出:1.00000示例 5:输入:nums1 = [2], nums2 = []输出:2.00000提示:nums1.length == mnums2.length == n0 <= m <= 10000 <= n <= 10001 <= m + n <= 2000-106 <= nums1[i], nums2[i] <= 106进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
解题思路:
把两个数组合并,然后进行排序,取出中位数
代码实现:
自己实现了快速排序。
/** @lc app=leetcode.cn id=4 lang=golang** [4] 寻找两个正序数组的中位数*/// @lc code=startfunc findMedianSortedArrays(nums1 []int, nums2 []int) float64 {nums1 = append(nums1, nums2...)quickSort(nums1)mid := len(nums1) / 2if len(nums1)%2 == 1 { //有可能合并的数组中的元素个数为单数return float64(nums1[mid])}return (float64(nums1[mid-1]) + float64(nums1[mid])) / 2.0}func quickSort(s []int) {if len(s) <= 1 {return}reference := s[0]left, right := 0, len(s)-1i := 1for left < right {if s[i] < reference {s[left], s[i] = s[i], s[left]left++i++} else {s[right], s[i] = s[i], s[right]right--}}quickSort(s[:left])quickSort(s[left+1:])}// @lc code=end
LeetCode
