zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    Git 常用命令
    Python 常用算法记录
    Python基础Web服务器案例
    你真的懂SDWebImage?
    Core Data的那点事儿~
    看看 SDWebImage内部基本实现过程
    App上架流程 & 上架被拒10大原因
    KVO中你所不知道的"坑"
    math公式手写识别网址
    umi build出现的Path must be a string的问题解决
  • 原文地址:https://www.cnblogs.com/shimu/p/6111200.html
Copyright © 2011-2022 走看看