题目难度---困难

题目要求:

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。

请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。

思路:第一眼看到题目两个数组求中位数,看似很复杂,但是仔细一想,两个数组合在一块不久行了?然后合并后的数组给他排序,进而判断是奇数位数组还是偶数位数组

ok!代码奉上:

public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int[] result = new int[nums1.length + nums2.length];// 首先初始化合并数组的大小
        List list = new LinkedList();// 建立新数组,目的是list集合插入方便
        if (result.length == 0) {// 判断数组是否为空
            return 0;
        }
        // 将两个数组中的值放入list集合中
        for (int i : nums1) {
            list.add(i);
        }

        for (int j : nums2) {
            list.add(j);
        }
        // 这部很关键--因为后面遍历整个数组排序数组会因为这部操作而大大简化
        for (int i = 0; i < list.size(); i++) {
            result[i] = (Integer) list.get(i);// 很简单的将list集合的元素一个个遍历到result数组中
        }
        // 下面就是新数组及合并后的数组排序
        for (int i = 0; i < result.length; i++) {

            for (int j = i + 1; j < result.length; j++) {

                if (result[i] >= result[j]) {
                    int temp = result[i];
                    result[i] = result[j];
                    result[j] = temp;
                }
            }
        }
        // -----------------这个地方就是判断数组的元素是奇数偶数,奇数取最中间的数就可以了,偶数就中间俩位取平均了
        double answer = 0;
        if (result.length % 2 == 1) {
            int q = result.length / 2;
            answer = result[q];
        } else {
            int p = result.length / 2;
            for (int i = 0; i < result.length; i++) {
                if (p - 1 == i) {
                    answer = result[i];
                    break;
                }
            }
            answer = (answer + result[p]) / 2;
        }
        // 上边注意的地方:数组元素计算奇数偶数后取值时应注意遍历是从0开始,因此result.length/2的值要比遍历变量大1
        return answer;
    }

看似很完美是吧!但是!!!时间复杂度的要求O(log (m+n)) 。

因为题目难度属于“困难”,因此不会这么简单,在参考了好多人的答案后,慢慢理解了。

思路:

二分查找思想一样,每次可以去掉k/2的值, k = (m + n) / 2;
该方法的核心是将原问题转换为一个寻找第k小数的问题,这样中位数实际上是第(m + n)/2小的数。因此本质问题是求解第k小数的问题
  
 
这个代码我就不放了,但是我参考的那几个人的链接大家可以参考借鉴下:
 

最新文章

  1. Android学习之 Intent详解
  2. 简单的php性能注意点
  3. 进入MFC讲坛的前言(五)
  4. Node.js(初识)
  5. PHP编译
  6. Java:import com.sun.awt.AWTUtilities;报错
  7. pymysql的使用
  8. python之路-----前端之css
  9. nginx配置fcgi
  10. Golang -- range小坑铭记
  11. windows server 2016 安装iis
  12. wifi 安卓手机
  13. 一分钟了解Android横竖屏 mdpi hdpi xhdpi xxhdpi xxxhdpi (转)
  14. 判断是否是微信浏览器JavaScript代码
  15. [转] malloc基本实现
  16. 【转】:Oracle Linux6.9下安装Oracle 11.2.0.4.0及psu补丁升级
  17. [AIR] AS3读取txt文档
  18. springboot整合kafka应用
  19. Windows SID理解
  20. 解决 Xshell 连接出现 The remote SSH server rejected X11 forwarding request 问题

热门文章

  1. node 基础精简
  2. SUSE 安装 iServer、iDesktop启动异常问题
  3. php中require、require_once、include、include_once类库重复引入效率问题详解
  4. strcat函数
  5. Java基础学习笔记二十 IO流
  6. 【alpha冲刺】随笔合集
  7. 20162328蔡文琛week06
  8. 简单的C语言编译器--概述
  9. MySQL 自关联查询
  10. android 自定义ScrollView实现背景图片伸缩(阻尼效果)