LeetCode 刷题:4. 寻找两个正序数组的中位数
2023-04-18 07:20:34
# 算法题
这题常规思路简单,但如果要达到官方要求的时间复杂度是比较难想的。
标题 | 寻找两个正序数组的中位数 |
---|---|
序号 | NO.4 |
难度 | 困难 |
标签 | 数组 二分查找 分治 |
1. 题目
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O (log (m+n)) 。
示例 1:
输入:nums1 = [1,3], nums2 = [2] |
示例 2:
输入:nums1 = [1,2], nums2 = [3,4] |
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-10<sup>6 <= nums1[i], nums2[i] <= 10</sup>6
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 代码
方法一
中位数是指数组中处在中间的位置的数,也就是在含有 n 个数的数组中,从小到大排列第 n/2 个数。只需要每次在这两个数组中选取一个值比较小的数,第 (m+n)/2 个数即为中位数,注意总数为偶数情况下,需要求平均值。这个方法需要查找 (m+n)/2 次,比合并数组节约一半时间,但仍未达到题目要求的时间复杂度 O (log (m+n))。
时间复杂度 O (m+n)
空间复杂度 O (1)
执行用时:52 ms, 在所有 Python3 提交中击败了 39.50% 的用户
内存消耗:15.2 MB, 在所有 Python3 提交中击败了 33.89% 的用户
1 | class Solution: |
- 执行用时:8 ms, 在所有 C 提交中击败了 97.53% 的用户
- 内存消耗:6.3 MB, 在所有 C 提交中击败了 56.65% 的用户
1 | double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){ |
方法二
看到时间复杂度要求是 log 级,所以肯定要使用二分法。方法待补充
时间复杂度 O (log (m+n))
空间复杂度 O (1)
执行用时:ms
内存消耗:MB
执行用时:ms
内存消耗:MB