• 【LeetCode】4. 寻找两个正序数组的中位数


    题目描述

    给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。

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

    你可以假设 nums1 和 nums2 不会同时为空。

    示例 1:

    nums1 = [1, 3]
    nums2 = [2]
    
    则中位数是 2.0
    

    示例 2:

    nums1 = [1, 2]
    nums2 = [3, 4]
    
    则中位数是 (2 + 3)/2 = 2.5
    

    题解代码

    class Solution {
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
             // 若仅当nums1为空
            if (nums1 == null || nums1.length == 0) {
                int length = nums2.length;
                int middle = length / 2;
                if (length % 2 == 0) {
                    return (nums2[middle] + nums2[middle - 1]) / 2.0;
                } else {
                    return nums2[middle];
                }
            }
            // 若仅当nums2为空
            if (nums2 == null || nums2.length == 0) {
                int length = nums1.length;
                int middle = length / 2;
                if (length % 2 == 0) {
                    return (nums1[middle] + nums1[middle - 1]) / 2.0;
                } else {
                    return nums1[middle];
                }
            }
            int len1 = nums1.length;
            int len2 = nums2.length;
            int middle = (len1+len2)/2;
            int currentIndex = 0;
    
            int i1 = 0, i2 = 0;
            int last = 0, current = 0;
    
            while(currentIndex <= middle){
                currentIndex++;
                last = current;
    
                /**
                 * 注意越界情况:
                 * 比如,
                 * 1 2 3 4
                 * 5 6 7 7 8 9
                 * 当然,数组为空的情况也包含在这里面
                 */
                // i1越界
                if(i1 == len1){
                    current = nums2[i2];
                    i2++;
                    continue;
                }
                // i2越界
                if(i2 == len2){
                    current = nums1[i1];
                    i1++;
                    continue;
                }
    
                // 正常操作
                if(nums1[i1] <= nums2[i2]){
                    current = nums1[i1];
                    i1++;
                } else {
                    current = nums2[i2];
                    i2++;
                }
            }
    
            // 分奇偶情况
            if((len1+len2) % 2 == 0){
                return (last + current) / 2.0;
            } else {
                return current;
            }
    
        }
    }
    

    提交

    更多题解

    详细通俗的思路分析,多解法
    寻找两个有序数组的中位数 C / C++
    中位数的小技巧

  • 相关阅读:
    poj 1654(利用叉积求面积)
    poj 3230(初始化。。动态规划)
    hdu 1392(凸包)
    hdu 1348(凸包)
    hdu 1147(线段相交)
    hdu 1115(多边形重心问题)
    POJ 2373 Yogurt factory
    GCJ 2008 APAC local onsites C Millionaire
    FZU 1397 保送
    FZU 1064 教授的测试
  • 原文地址:https://www.cnblogs.com/melodyjerry/p/12950294.html
Copyright © 2020-2023  润新知