两个排序数组的中位数
2021-07-14 19:06
标签:parse NPU mil code row amp new static min
两个排序数组的中位数 标签:parse NPU mil code row amp new static min 原文地址:https://www.cnblogs.com/mudaoyuye/p/9537674.html
中位数是 2.0
中位数是 (2 + 3)/2 = 2.5 1 import java.io.IOException;
2 import java.util.Arrays;
3 import java.util.Scanner;
4
5 public class MedianSortedArrays {
6 public static void main(String[] args) throws IOException{
7 /*获取输入内容*/
8 Scanner input = new Scanner(System.in);
9 System.out.println("请输入第一个数组,元素间以逗号隔开:");
10 int[] nums1=stringToArray(input.nextLine());
11 System.out.println("请输入第二个数组,元素间以逗号隔开:");
12 int[] nums2=stringToArray(input.nextLine());
13 System.out.println("这两个数组的中位数是:");
14 Solution getMedian=new Solution();
15 Arrays.sort(nums1);
16 Arrays.sort(nums2);
17 double median=getMedian.findMedianSortedArrays(nums1,nums2);
18 System.out.println(median);
19 }
20
21 /**
22 * 将获取的字符串转为数组
23 */
24 public static int[] stringToArray(String str){
25 String[] strArr= str.split(",");
26 int[] arr=new int[strArr.length];
27 for(int i=0;i
1 class Solution {
2 public double findMedianSortedArrays(int[] nums1, int[] nums2) {
3 int m = nums1.length, n = nums2.length, left = (m + n + 1) / 2, right = (m + n + 2) / 2;
4 return (findKth(nums1, nums2, left) + findKth(nums1, nums2, right)) / 2.0;
5 }
6 int findKth(int[] nums1, int[] nums2, int k) {
7 int m = nums1.length, n = nums2.length;
8 if (m > n) return findKth(nums2, nums1, k);
9 if (m == 0) return nums2[k - 1];
10 if (k == 1) return Math.min(nums1[0], nums2[0]);
11 int i = Math.min(m, k / 2), j = Math.min(n, k / 2);
12 if (nums1[i - 1] > nums2[j - 1]) {
13 return findKth(nums1, Arrays.copyOfRange(nums2, j, n), k - j);
14 } else {
15 return findKth(Arrays.copyOfRange(nums1, i, m), nums2, k - i);
16 }
17 }
18 }