ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-08-29 07:31:35  阅读:183  来源: 互联网

标签:count 正序 nums 中位数 len nums1 new LeetCode nums2


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

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

解法一:代码简洁,但用了内置排序函数。
def findMedianSortedArrays(nums1, nums2):
    # 判空
    if not nums1 and not nums2:
        return 0
    # 一方为空
    elif (not nums1 and nums2) or (not nums2 and nums1):
        nums = nums1 or nums2
    # 非空
    else:
        nums = nums1 + nums2
        nums.sort()
    if len(nums) % 2 != 0:
        mid = int((len(nums) - 1) / 2)
        return nums[mid]
    else:
        right = int((len(nums) / 2))
        left = int(right - 1)
        return (nums[left] + nums[right]) / 2

解法二:真正面试中,考官往往不许我们使用任何内置排序函数,所以只能自己手写排序!
以下的排序不是通用排序方法,而是根据题目--正序(从小到大)数组写的一个排序,仅供参考。
def findMedianSortedArrays(nums1, nums2):
    # 判空
    if not nums1 and not nums2:
        return 0
    # 一方为空
    elif (not nums1 and nums2) or (not nums2 and nums1):
        new_nums = nums1 or nums2
    # 非空
    else:
        # 不使用内置排序函数,自己手写排序
        import copy
        len1, len2 = len(nums1), len(nums2)
        longer_nums = nums1 if len1 > len2 else nums2
        short_nums = nums2 if len1 > len2 else nums1
        # 此处要进行深拷贝,否则后面 new_nums 插入元素时,longer_nums 也会同步变化
        new_nums = copy.deepcopy(nums1) if len1 > len2 else copy.deepcopy(nums2)
        count = 0
        for idx, num in enumerate(longer_nums):
            while count < len(short_nums):
                if short_nums[count] > num:
                    if idx == len(longer_nums) - 1:
                        new_nums.extend(short_nums[count:])
                    break
                else:
                    # idx + count :第二个往后的元素在插入时,除了idx下标位,还因为前面元素的插入额外移动了count位
                    new_nums.insert(idx + count, short_nums[count])
                    count += 1
            if idx == len(longer_nums) - 1:
                break
    if len(new_nums) % 2 != 0:
        mid = int((len(new_nums) - 1) / 2)
        return new_nums[mid]
    else:
        right = int((len(new_nums) / 2))
        left = int(right - 1)
        return (new_nums[left] + new_nums[right]) / 2
     

标签:count,正序,nums,中位数,len,nums1,new,LeetCode,nums2
来源: https://www.cnblogs.com/5Y-architect/p/15201805.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有