题目描述:

  1. 给定两个大小分别为 m n 的正序(从小到大)数组 nums1 nums2。请你找出并返回这两个正序数组的 中位数
  2. 示例 1
  3. 输入:nums1 = [1,3], nums2 = [2]
  4. 输出:2.00000
  5. 解释:合并数组 = [1,2,3] ,中位数 2
  6. 示例 2
  7. 输入:nums1 = [1,2], nums2 = [3,4]
  8. 输出:2.50000
  9. 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
  10. 示例 3
  11. 输入:nums1 = [0,0], nums2 = [0,0]
  12. 输出:0.00000
  13. 示例 4
  14. 输入:nums1 = [], nums2 = [1]
  15. 输出:1.00000
  16. 示例 5
  17. 输入:nums1 = [2], nums2 = []
  18. 输出:2.00000
  19. 提示:
  20. nums1.length == m
  21. nums2.length == n
  22. 0 <= m <= 1000
  23. 0 <= n <= 1000
  24. 1 <= m + n <= 2000
  25. -106 <= nums1[i], nums2[i] <= 106
  26. 进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?

解题思路:

把两个数组合并,然后进行排序,取出中位数

代码实现:

自己实现了快速排序。

  1. /*
  2. * @lc app=leetcode.cn id=4 lang=golang
  3. *
  4. * [4] 寻找两个正序数组的中位数
  5. */
  6. // @lc code=start
  7. func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
  8. nums1 = append(nums1, nums2...)
  9. quickSort(nums1)
  10. mid := len(nums1) / 2
  11. if len(nums1)%2 == 1 { //有可能合并的数组中的元素个数为单数
  12. return float64(nums1[mid])
  13. }
  14. return (float64(nums1[mid-1]) + float64(nums1[mid])) / 2.0
  15. }
  16. func quickSort(s []int) {
  17. if len(s) <= 1 {
  18. return
  19. }
  20. reference := s[0]
  21. left, right := 0, len(s)-1
  22. i := 1
  23. for left < right {
  24. if s[i] < reference {
  25. s[left], s[i] = s[i], s[left]
  26. left++
  27. i++
  28. } else {
  29. s[right], s[i] = s[i], s[right]
  30. right--
  31. }
  32. }
  33. quickSort(s[:left])
  34. quickSort(s[left+1:])
  35. }
  36. // @lc code=end

LeetCode