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 };
  • 相关阅读:
    浅谈Android系统开发中LOG的使用
    在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务
    美国地名大全(美国城市名称英文、中文)
    简单工厂模式
    Union和Union All的差别
    strlen和sizeof的差别
    css+div网页设计(一)--基础知识
    Java程序猿面试题集(181- 199)
    【Android XMPP】 学习资料收集贴(持续更新)
    curl命令具体解释
  • 原文地址:https://www.cnblogs.com/shimu/p/6111200.html
Copyright © 2011-2022 走看看