• 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
  • 相关阅读:
    SQL数据库一直显示正在还原
    jQuery获取display为none的隐藏元素的宽度和高度的解决方案
    火狐打开新标签页面不出现九宫格的设置
    【转】在C#中?,?:和??
    【转】JS字符(字母)与ASCII码转换方法
    如何为 .NET Core 安装本地化的 IntelliSense 文件
    compass typography 排版 常用排版方法[Sass和compass学习笔记]
    单元测试 逃不开的Done 与约定
    SASS+COMPASS 自适应 学习笔记
    compass tables 表格 表格常见样式[Sass和compass学习笔记]
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/10226078.html
Copyright © 2020-2023  润新知