• leetcode Median of Two Sorted Arrays


    参考自:http://blog.csdn.net/yutianzuijin/article/details/11499917/

    明显时间复杂度要求log,很容易想到二分。但是对于数组二分没法做,那就对于第(m+n)/2这个数字进行二分,因为就是要求顺序位置在这里的数

    思考对于第k大的数,两个数组元素中a[k/2-1]和b[k/2-1]进行比较,小的那个数肯定不可能是符合要求的数,且其所在的数列中比它小的数也不可能符合要求这样就能排除一部分数,同时k也可以减去一半,直到k为1或者有个数列中元素被减光或者a[k/2-1],b[k/2-1]相等(此时必定为要求的数)。问题是题目给出的是不定长数组我猥琐地变成了数组,要不然find函数内形参就太多了,因为要时时记录左右边界,没数组那么方便,不知道vector可不可以有数组那样的用法,,,

     1 int find(int a[],int m,int b[],int n,int k){
     2     if(m == 0) return b[k-1];
     3     if(m > n) return find(b,n,a,m,k);
     4     if(k == 1) return min(a[0],b[0]);
     5     int pa = min(k/2,m),pb = k - pa;
     6     if(a[pa-1] < b[pb-1]) return find(a + pa,m - pa,b,n,k-pa);
     7     else if(a[pa - 1] > b[pb - 1]) return find(a,m,b + pb,n - pb,k - pb);
     8     else return a[pa-1];
     9 }
    10 class Solution {
    11 public:
    12     double findMedianSortedArrays(vector<int>&nums1, vector<int>nums2) {
    13         int a = nums1.size(),b = nums2.size();
    14         int num1[100000],num2[100000];
    15         for(int i = 0;i < a;i++) num1[i] = nums1[i];
    16         for(int i = 0;i < b;i++) num2[i] = nums2[i];
    17         if((a+b)&1) return find(num1,a,num2,b,(a+b)/2+1);
    18         else return (
    19             ((double)find(num1,a,num2,b,(a+b)/2) + (double)find(num1,a,num2,b,(a+b)/2+1))/2
    20             );
    21     }
    22 };
  • 相关阅读:
    SuperSocket 2.0 发布第一个预览版, 另寻找Yang Fan哥哥
    使用LogMaster4Net实现应用程序日志的集中管理
    博客终结
    我的第一个Socket程序-SuperSocket使用入门(三)
    树莓派 HC-SRO4超声波测距模块的使用
    树莓派 LED+蜂鸣+声音传感器+红外模块组合打造声控/红外控制LED
    Python Django 开发 4 ORM
    Raspberry Pi --操作LED
    Python Django 开发 3 数据库CURD
    Python Django 开发 2 数据库
  • 原文地址:https://www.cnblogs.com/shimu/p/6111200.html
Copyright © 2020-2023  润新知