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
  • 相关阅读:
    奇偶校检只能检出奇数个误差数学证明
    散列函数之双重散列算法解决冲突问题
    散列函数之单散列算法解决冲突问题
    散列函数之简单散列函数算法
    费马因式分解算法优化及素数判定
    完全平方数的末两位数字类型的另一种证明
    贪婪算法硬币找零最优解问题证明2
    贪婪算法硬币找零最优解问题证明
    改进冒泡排序法
    DASH MP4 cenc 笔记
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/10226078.html
Copyright © 2011-2022 走看看