zoukankan      html  css  js  c++  java
  • Leetcode 寻找两个有序数组的中位数

    2020-04-26

    原题链接

    • 思路

    题意就是寻找两个有序数组的中位数。第一反应可能会先把两个数组合并然后再找中位数,但是显然我们没有必要把合并后的数组存起来,只要依次搜索,得到最中间的一个或两个就可。美中不足的是它的时间复杂度为 O(m + n)

    为了达到题目中时间复杂度为 O(log(m + n)) 的要求,我们可以使用二分(其实也是看了题解后 ohhhhhhh )。前面我们是一个一个剔除,现在我们可以一次剔除 (m + n) / 4 个。直接比较 nums1[(m+n)/4]nums2[(m+n)/4] ,若 nums1[(m+n)/4] 小,则它和它之前的部分就可以被直接剔除,因为他们一定是在中位数之前(我也想过是否也可以把 nums2[(m+n)/4] 之前的也去掉呢,答案是不可以)。以这个思路反复直到得到 (m + n) / 2(m + n) / 2 + 1 位的两个数。这个方法的边界判断烦得不行,更有趣的是要注意 [] [1] 类似的各种极端情况。

    顺便吐嘈一句这个垃圾网站 coding 体验极差 hhh

    • 代码

    O(m + n):

    /*
     *lang C++
     *user weilinfox
     */
    class Solution {
    public:
        static double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            long long a = nums1.size(), b = nums2.size();
            int t, tp;
            for (long long i = 0, j = 0; i + j + 1 <= (a + b) / 2 + 1;) {
                tp = t;
                if (i < a && j < b) {
                    t = nums1[i];
                    if (t > nums2[j]) {
                        t = nums2[j];
                        j++;
                    } else
                        i++;
                } else if (i < a)
                    t = nums1[i++];
                else
                    t = nums2[j++];
            }
            a += b;
    
            if (a % 2 == 0)
                return (double)(t + tp) / 2.0;
            else
                return (double)t;
                
        }
    };
    

    by SDUST weilinfox
    本文链接 https://www.cnblogs.com/weilinfox/p/12781374.html

  • 相关阅读:
    Windows下如何通过PLSQL连接Oracle
    Windows下安装Oracle
    Linux下安装Oracle
    Linux命令学习-top命令
    Python3下字典、字符串及列表的相互转换
    Linux下搭建Jmeter+Ant+Jenkins自动化测试框架
    Linux下利用Ant调用Jmeter脚本生成HTML测试报告
    Linux下安装Ant
    Linux下安装Jmeter
    python连接数据库
  • 原文地址:https://www.cnblogs.com/weilinfox/p/12781374.html
Copyright © 2011-2022 走看看