leetcode代码记录(寻找两个正序数组的中位数

简介: leetcode代码记录(寻找两个正序数组的中位数

1. 题目:

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数

算法的时间复杂度应该为 O(log (m+n)) 。

示例 1:

输入:nums1 = [1,3], nums2 = [2]

输出:2.00000

解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]

输出:2.50000

解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

2. 我的代码:

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        # 快慢指针
        p_1 = 0
        p_2 = 0

        new_nums = []

        # 合并数组
        p = 0
        while p_1 < len(nums1) and p_2 < len(nums2):
            if nums1[p_1] < nums2[p_2]:
                new_nums.append(nums1[p_1])
                p_1 += 1
            else:
                new_nums.append(nums2[p_2])
                p_2 += 1
            
        if p_1 < len(nums1):
            new_nums += nums1[p_1:]
        if p_2 < len(nums2):
            new_nums += nums2[p_2:]

        # 找中位数
        if len(new_nums) % 2 == 0:
            return (new_nums[len(new_nums) // 2] + new_nums[len(new_nums) // 2 - 1]) / 2
        else:
            return new_nums[len(new_nums) // 2]

利用快慢指针,求解两个有序数组的并集(并集仍然保持有序),两个指针分别从num1和num2左边向右移动,将更小的元素添加到新数组中。

左右指针走完之后,将剩余的元素直接添加到末尾即可。

中位数计算就是奇数偶数的区别了,比较好理解。

目录
相关文章
|
5天前
|
机器学习/深度学习
leetcode代码记录(旋转图像
leetcode代码记录(旋转图像
10 0
|
5天前
|
算法
leetcode代码记录(全排列 II
leetcode代码记录(全排列 II
13 4
|
5天前
|
算法
leetcode代码记录(全排列
leetcode代码记录(全排列
12 1
|
5天前
|
索引
leetcode代码记录(Z 字形变换
leetcode代码记录(Z 字形变换
11 1
|
5天前
leetcode代码记录(最长回文子串
leetcode代码记录(最长回文子串
10 2
|
5天前
leetcode代码记录(回文数
leetcode代码记录(回文数
13 1
|
5天前
leetcode代码记录(两数之和
leetcode代码记录(两数之和
11 1
|
5天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
9 0
|
5天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
12 0