import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums1 int整型ArrayList * @param nums2 int整型ArrayList * @return double浮点型 */ public double Median(ArrayList<Integer> nums1, ArrayList<Integer> nums2) { ArrayList<Integer> merged = new ArrayList<>(); int n = nums1.size(); int m = nums2.size(); int i = 0, j = 0; while (i < n && j < m) { if (nums1.get(i) < nums2.get(j)) { merged.add(nums1.get(i)); i++; } else { merged.add(nums2.get(j)); j++; } } while (i < n) { merged.add(nums1.get(i)); i++; } while (j < m) { merged.add(nums2.get(j)); j++; } int length = merged.size(); if (length % 2 == 0) { int mid = length / 2; return (merged.get(mid - 1) + merged.get(mid)) / 2.0; } else { return merged.get(length / 2); } } }
题目描述:给定两个长度分别为 n 和 m 的升序数组,要求找到这两个数组中全部元素的中位数。
解题思路:要找到两个升序数组的中位数,可以使用合并排序的方法。首先,将两个数组合并成一个新的升序数组。然后,根据合并后数组的长度来确定中位数的位置,如果长度为奇数,中位数就是合并后数组中间位置的元素;如果长度为偶数,中位数是合并后数组中间两个位置元素的平均值。
具体步骤:
- 创建一个新的数组,用于存储合并后的数组元素。
- 使用双指针的方法,初始化两个指针分别指向两个数组的开头。
- 比较指针位置的元素大小,将较小的元素放入新的数组中,并移动指向较小元素的指针。
- 重复步骤3,直到遍历完两个数组的所有元素。
- 如果合并后数组长度为奇数,返回中间位置的元素;如果长度为偶数,返回中间两个元素的平均值。
复杂度分析:
- 时间复杂度:合并排序需要遍历两个数组的所有元素,所以时间复杂度为 O(n + m)。
- 空间复杂度:创建了一个新的数组来存储合并后的数组元素,所以空间复杂度为 O(n + m)。