力扣hot100 4*寻找两个正序数组的中位数(二分查找)待补充

目录

    • 题目介绍
    • 题解1(归并排序思想)
    • 解法二:为使时间复杂度达到 O(log(M+N)) ,典型的二分查找思路
      • 关于二分查找的热身题目:hot100 35
      • 本题解法:

题目介绍

力扣hot100 4*寻找两个正序数组的中位数(二分查找)待补充_第1张图片
力扣hot100 4*寻找两个正序数组的中位数(二分查找)待补充_第2张图片

题解1(归并排序思想)

思路:因为已经有序,所以只需要先合并两个数组,然后找出中位数即可,时间复杂度为O(M+N)

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        # 归并排序合并数组(已经有序所以直接归并)
        nums3 = []
        idx1, idx2 = 0, 0
        while idx1 < len(nums1) and idx2 < len(nums2):
            a, b = nums1[idx1], nums2[idx2]
            if a <= b:
                nums3.append(a)
                idx1 += 1
            else:
                nums3.append(b)
                idx2 += 1
        nums3 += nums1[idx1:]
        nums3 += nums2[idx2:]
        print(nums3)
        # 找到中位数并返回
        len_temp = len(nums3)
        return nums3[len_temp//2] if len_temp%2!=0 else (nums3[(len_temp//2)-1]+nums3[len_temp//2])/2

解法二:为使时间复杂度达到 O(log(M+N)) ,典型的二分查找思路

关于二分查找的热身题目:hot100 35

力扣hot100 4*寻找两个正序数组的中位数(二分查找)待补充_第3张图片

解法:(二分查找)
需要注意的点,mid 直接设置就好,不用管长度的奇偶(后面只要保持left <= right 就好);该数如果不在数组中,那么最后返回 left (如果数字不存在,left最后肯定会移动到合适的插入位置)

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left,right = 0,len(nums)-1
        while left <= right:
            mid = (left+right)//2
            if target == nums[mid]:
                return mid
            elif target < nums[mid]:
                right = mid-1
            else:
                left = mid + 1
        return left

关于二分查找的详解与链接,很重要自己有时间一定要看,可以加深理解

本题解法:

在这里插入代码片

你可能感兴趣的:(leetcode,leetcode,算法)