zoukankan      html  css  js  c++  java
  • leetcode4 Median of Two Sorted Arrays学习记录

    学习了扁扁熊的题解:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/4-xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-shu/
    记录一下,顺便按自己的理解给代码加上注释

    #include <vector>
    #include <stdio.h>
    using namespace std;
    #define max(a,b) (((a)>(b)) ? (a) : (b) )
    #define min(a,b) (((a)<(b)) ? (a) : (b) )
    class Solution {
    public:
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int m=nums1.size();
            int n=nums2.size();
            //保持数组1为短的是为了提高效率,其实只要选定一个数组二分就可以了。
            if(m>n)
            {
                return findMedianSortedArrays(nums2,nums1);
            }
            //lo是数组的左部,hi是数组的末尾,为了防止奇偶问题,把数组长度已经变成2m+1和2n+1
            //数组末尾应该是2m+1,下标从0开始,所以hi是2m
            int LMax1,LMax2,RMin1,RMin2,c1,c2,lo=0,hi=m*2;
            //开始二分数组1
            while(lo<=hi)
            {
                c1=(lo+hi) /2 ;
                c2 = m+n - c1; //因为分别数组扩大到了2倍,所以是中位数在m+n+1 即(2m+1+2n+1)/2
                //我们知道要保持从c1+c2=k,注意m+n就是相当于m+n+1(下标从0开始)
                
                //当数组1二分完了,如果遇到割在数组的两边,说明整个数组都是大于或者小于目标中位数的
                //这个时候数组1的LMax和RMin是不能参与计算最后的中位数
                //所以要特殊处理一下,例如c1==0,说明数组1整个都大于目标中位数,那么LMax1一定会大于LMax2
                //可我们不希望LMax1作为结果的一部分,结果应该是由LMax2和RMin2计算出来的,所以此时强行把LMax1=INT_MIN
                //这样最后求中位数,就Max(LMax1,LMax2)就不会返回LMax1而是LMAx2。别的情况以此类推
                LMax1=(c1==0)?INT_MIN:nums1[(c1-1)/2];
                RMin1=(c1==2*m)?INT_MAX:nums1[c1/2];
                LMax2=(c2==0)?INT_MIN:nums2[(c2-1)/2];
                RMin2=(c2==2*n)?INT_MAX:nums2[c2/2];
                
                if(LMax1>RMin2)
                {
                    hi=c1-1;
                }else if(LMax2>RMin1)
                {
                    lo=c1+1;
                }else
                    break;
            }
            //题解里解释过,拿#填充扩大2倍的数组,中位数=(LMax+RMin)/2
            return (max(LMax1,LMax2)+min(RMin1,RMin2))/2.0;
        }
    };
    

    主要是记录一下,学习完扁扁熊题解的感悟,顺便写一下大佬没详细说明的部分。

  • 相关阅读:
    榫卯游戏介绍
    如果你有一个域名,你也可以免费有一个diy@yourdomain.com的企业邮局
    封装一个axios请求后台的通用方法
    javascript判断两个对象属性以及值是否相等
    遍历出文档内所有元素的tagName
    windows下nginx的安装及使用方法入门
    css样式重置样式
    canvas绘图
    表单脚本
    javascript事件
  • 原文地址:https://www.cnblogs.com/HaoPengZhang/p/11426975.html
Copyright © 2011-2022 走看看