Leetcode-Java #4.寻找两个正序数组的中位数

23 阅读1分钟

LeetCodeLogo.png

题目

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log(m+n)) 。

示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2

示例 2: 输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

题解

暂时没想到O(log(m+n))的方法,先用O(m+n)解出来

merge合并两个有序数组直到需要的中位数,根据偶数还是奇数拿结果计算中位数


package leetcode.editor.cn;

class 寻找两个正序数组的中位数 {
    public static void main(String[] args) {
        Solution solution = new 寻找两个正序数组的中位数().new Solution();
        int[] nums1 = new int[]{1, 2};
        int[] nums2 = new int[]{3, 4};
        // int[] nums1 = new int[]{1, 3};
        // int[] nums2 = new int[]{2};
        double medianSortedArrays = solution.findMedianSortedArrays(nums1, nums2);
        System.out.println(medianSortedArrays);
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
            if (nums1 == null && nums2 == null) {
                return -1;
            }

            int allLength = nums1.length + nums2.length;
            //merge 一直合并到第k位
            int k = allLength / 2 + 1;
            int[] mergeNums = merge(nums1, nums2, k);
            return allLength % 2 == 0 ? (mergeNums[k - 2] + mergeNums[k - 1]) / 2D : mergeNums[k - 1];
        }

        private int[] merge(int[] nums1, int[] nums2, int k) {
            int[] mergeNums = new int[k];
            int nums1Index = 0, nums2Index = 0;
            for (int i = 0; i < k; i++) {
                if (nums1Index >= nums1.length) {
                    mergeNums[i] = nums2[nums2Index];
                    nums2Index++;
                    continue;
                }
                if (nums2Index >= nums2.length) {
                    mergeNums[i] = nums1[nums1Index];
                    nums1Index++;
                    continue;
                }

                mergeNums[i] = Math.min(nums1[nums1Index], nums2[nums2Index]);
                if (nums1[nums1Index] < nums2[nums2Index]) {
                    nums1Index++;
                } else {
                    nums2Index++;
                }
            }
            return mergeNums;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}