LeetCode #4解题: Median of two sorted arrays(双边剔除法)

本文详细介绍了如何使用双边剔除法解决LeetCode第4题——找到两个有序数组的中位数。通过比较两个数组的首尾元素,不断剔除较小或较大的数,直到其中一个数组为空,然后根据非空数组的中位数计算最终的中位数。这种方法避免了合并数组,实现了O(log(m+n))的时间复杂度。
摘要由CSDN通过智能技术生成

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==</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值