力扣-寻找两个正序数组的中位数
寻找两个正序数组的中位数
题目描述
题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
难度:困难
给定两个大小分别为
m和n的正序(从小到大)数组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

浙公网安备 33010602011771号