力扣-寻找两个正序数组的中位数

寻找两个正序数组的中位数

题目描述

题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/

难度:困难

给定两个大小分别为 mn 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n))

解析:

本题复杂度提示的已经比较明显,不可能用排序等常规手段来解决。本题目考察的主要是将两个同序有序数组合并成一个有序数组。

方法:比较两个数组的头部元素,每次弹出最小的那个。这样一来数字弹出的顺序即为从小到大的顺序(对于本题来说)。

代码:

代码写的倒是比较乱

class Solution:
    def findMedianSortedArrays(self, nums1: list[int], nums2: list[int]) -> float:
        len_1 = len(nums1)  # 用来判断取元素是否超出下标
        len_2 = len(nums2)
        
        all_len = len_1 + len_2  # 计算合并后的大小

        cnt = all_len // 2 + 1  # 由于是取中位数,因此不用全部合并,只用合并一半,这里是合并的数字个数

        idx_1, idx_2 = 0, 0  # 两个数组当前取元素的下标

        ans1, ans2 = 0, 0  # 由于偶数长度需要计算两个数字之和,因此这里只保存已经合并的最后两个有序元素。

        for i in range(cnt):
			# 对应三种情况,两边数组都没取完;或者其中一个取完了。
            if idx_1 < len_1 and idx_2 < len_2:
                if nums1[idx_1] < nums2[idx_2]:
                    ans1, ans2 = nums1[idx_1], ans1
                    idx_1 += 1
                else:
                    ans1, ans2 = nums2[idx_2], ans1
                    idx_2 += 1
            
            elif idx_1 >= len_1:
                ans1, ans2 = nums2[idx_2], ans1
                idx_2 += 1

            elif idx_2 >= len_2:
                ans1, ans2 = nums1[idx_1], ans1
                idx_1 += 1

        if all_len % 2 == 0:  # 偶数情况,计算平均数
            return (ans1 + ans2) / 2
        
        return ans1
posted @ 2022-01-19 16:45  XBCoder  阅读(32)  评论(0)    收藏  举报