LeetCode #4解题: Median of two sorted arrays(双边剔除法)
一.题目原文
Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.
The overall run time complexity should be O(log (m+n)).
Example 1:
Input: nums1 = [1,3], nums2 = [2]
Output: 2.00000
Explanation: merged array = [1,2,3] and median is 2.
Example 2:
Input: nums1 = [1,2], nums2 = [3,4]
Output: 2.50000
Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.
Example 3:
Input: nums1 = [0,0], nums2 = [0,0]
Output: 0.00000
Example 4:
Input: nums1 = [], nums2 = [1]
Output: 1.00000
Example 5:
Input: nums1 = [2], nums2 = []
Output: 2.00000
Constraints:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
二.解题思路
(本人也不是计算机专业出身, 时间复杂度也不太会算, 就不去考虑了, 只求用简洁容易理解的方法来求解)
原始思路: 合并两个数组, 找到合并之后数组的最小值和最大值, 剔除这两个数, 继续找剩余的数组的最大值和最小值, 继续剔除两个最值, … 直到最后剩下的1个或2个数, 就可以求出中位数了.
在本题中, 原始数组1和2都是有序的, 因此实际上我们并不需要真的合并数组后再找最值, 只需要分别比较两个数组的第一个数(两小取最小) 和 最后一个数(两大取最大), 就可以得到最值.
因为我们并没有真正合并两个数组, 因此运气好的话并不需要剔除到最后只剩下1或2个数, 只需要剔除到其中一个数组剩余的个数为 0, 我们就可以直接找另一个有序数组剩余数据的中位数, 就是最终的结果.
程序设计
循环执行以下操作:
- 比较两个数组的第一个数, 剔除小的那个
- 比较两个数组的最后一个数, 剔除大的那个
即每次剔除2个数, 最多循环 (m+n)/2 次, 必然会出现以下情况之一:
- 数组1 剩余size = 0 但 数组2 剩余size 不为 0
- 数组2 剩余size = 0 但 数组1 剩余size 不为 0
- 数组1 和数组2 剩余size 都为 1
出现这些情况就可以跳出循环, 直接求解.
三.上代码(C语言实现)
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
if(nums1Size==</