zoukankan      html  css  js  c++  java
  • Leetcode 4. Median of Two Sorted Arrays(二分)

    4. Median of Two Sorted Arrays

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

    Description:

    There are two sorted arrays nums1 and nums2 of size m and n respectively.

    Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

    You may assume nums1 and nums2 cannot be both empty.

    Example 1:

    nums1 = [1, 3]
    nums2 = [2]
    
    The median is 2.0
    

    Example 2:

    nums1 = [1, 2]
    nums2 = [3, 4]
    
    The median is (2 + 3)/2 = 2.5

    题意:

    给出两个数组nums1,nums2,数组里面的数都是单增的,要求在log(n+m)的时间内,找出两个数组合并后的中位数。

    题解:

    最近看了看leetcode的题,感觉还是挺有意思的。

    这个题就要充分利用中位数的性质来解,中位数,我们首先最容易想到的就是中间位置的数。

    其实还有的性质就是:中位数将数列划分为左右两边数量相等且max(left)<=min(right)。

    对于长度为偶数,那么左右两边数量可以相等,对于奇数,那么我们这里假定左边的数量比右边大于1。

    根据数组单调的这一特征,我们可以二分来划分数组,二分数组nums1在左边的个数i,那么nums2在左边的个数就可以算出来为(n+m+1)/2-i。

    最后判断一下nums1[i-1]和nums2[j]以及nums1[j-1]和nums2[i]就ok了。

    这里注意一下边界情况:即i=0,i=n,j=0,j=m时的情况,由于我们的算法,i=0,j=0不会同时出现,i=n,j=m也不会同时出现,所以左边部分和右边部分至少有一个数组。最后判断一下就好了。

    建议自己去实现代码~还是有细节的。

    代码如下:

    class Solution {
    public:
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int n=nums1.size(),m=nums2.size();
            if(n>m) swap(nums1,nums2),swap(n,m);
            int l=0,r=n+1;
            while(l<r){
                int i = l+r>>1;//0~i-1
                int j = (n+m+1>>1)-i;//0~j-1
                if(j<m && i>=1 && nums1[i-1]>nums2[j]) r=i;
                else if(i<n && j>=1 && nums2[j-1]>nums1[i]) l=i+1;
                else{
                    int max_left,min_right;
                    if(i==0) max_left = nums2[j-1];
                    else if(j==0) max_left = nums1[i-1];
                    else max_left=max(nums1[i-1],nums2[j-1]);
                    if(n+m&1) return max_left;
                    if(i==n) min_right = nums2[j];
                    else if(j==m) min_right = nums1[i];
                    else min_right = min(nums1[i],nums2[j]);
                    return (max_left+min_right)/2.0;
                }
            }
            return 0;
        }
    };
    View Code
  • 相关阅读:
    vue系列---identify(生成图片验证码)插件
    vue中的锚链接跳转问题
    vue中怎样实现 路由拦截器
    Vue生命周期和考点
    Vue如何使用vue-area-linkage实现地址三级联动效果
    JS的Key-Val(键值对)设置Key为动态的方法
    web开发——在网页中引用字体包(.ttf),即嵌入特殊字体
    spring boot 实现多个 interceptor 并指定顺序
    BigDecimal加减乘除计算
    乐观锁解决并发问题
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/10226078.html
Copyright © 2011-2022 走看看