力扣题目
解题思路
java代码
力扣题目:
给定两个大小分别为 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
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
解题思路:
-
findMedianSortedArrays
方法接收两个已排序的整数数组nums1
和nums2
作为参数,并返回这两个数组合并后的中位数。 -
首先,定义了
m
和n
两个变量,分别存储数组nums1
和nums2
的长度。 -
接着,创建了一个新的数组
nums
,长度为m + n
,用于存放合并后的两个数组。 -
使用三个指针
i
、j
和k
分别遍历数组nums1
、nums2
和nums
。其中,i
和j
用于遍历输入的数组,k
用于在合并后的数组nums
中放置元素。 -
通过一个
while
循环,比较nums1[i]
和nums2[j]
,将较小的元素放入nums
中,并递增相应的指针。 -
如果
nums1
或nums2
中有剩余的元素,则通过接下来的两个while
循环将它们复制到nums
中。 -
最后,根据合并后数组的长度是奇数还是偶数,计算中位数:
- 如果是偶数,则中位数是中间两个元素的平均值。
- 如果是奇数,则中位数是中间的元素。
下面是代码的运行逻辑:
- 当
nums1
和nums2
的长度之和是奇数时,中位数是合并后数组中间的元素,即nums[(m + n) / 2]
。 - 当
nums1
和nums2
的长度之和是偶数时,中位数是合并后数组中间两个元素的平均值,即(nums[(m + n) / 2] + nums[(m + n) / 2 - 1]) / 2.0
。
java代码:
package org.example.mouth7.taday18;
public class Leetcode4 {
public static void main(String[] args) {
int[] nums1 = {1, 2};
int[] nums2 = {3, 4};
System.out.println(findMedianSortedArrays(nums1, nums2));
}
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int[] nums = new int[m + n];
int i = 0;
int j = 0;
int k = 0;
while (i < m && j < n) {
if (nums1[i] < nums2[j]) {
nums[k++]= nums1[i++];
}
else {
nums[k++] = nums2[j++];
}
}
while (i < m) {
nums[k++] = nums1[i++];
}
while (j < n) {
nums[k++] = nums2[j++];
}
if ((m + n) % 2 == 0) {
return (nums[(m + n) / 2] + nums[(m + n) / 2 - 1]) / 2.0;
} else {
return nums[(m + n) / 2];
}
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项