|
| 1 | +package binary_search.median_of_two_sorted_arrays; |
| 2 | + |
| 3 | +/** |
| 4 | + * @author Bota5ky |
| 5 | + * @link <a href="https://leetcode.cn/problems/median-of-two-sorted-arrays/">4. 寻找两个正序数组的中位数</a> |
| 6 | + * @since 2023-11-03 14:47 |
| 7 | + */ |
| 8 | +class Solution { |
| 9 | + public double findMedianSortedArrays(int[] nums1, int[] nums2) { |
| 10 | + int len1 = nums1.length; |
| 11 | + int len2 = nums2.length; |
| 12 | + var odd = findKth(nums1, 0, len1 - 1, nums2, 0, len2 - 1, (len1 + len2 + 1) / 2); |
| 13 | + var even = findKth(nums1, 0, len1 - 1, nums2, 0, len2 - 1, (len1 + len2 + 2) / 2); |
| 14 | + return (odd + even) / 2.0; |
| 15 | + } |
| 16 | + |
| 17 | + private int findKth(int[] nums1, int start1, int end1, int[] nums2, int start2, int end2, int k) { |
| 18 | + var len1 = end1 - start1 + 1; |
| 19 | + var len2 = end2 - start2 + 1; |
| 20 | + if (len1 > len2) { |
| 21 | + return findKth(nums2, start2, end2, nums1, start1, end1, k); |
| 22 | + } |
| 23 | + if (len1 == 0) { |
| 24 | + return nums2[start2 + k - 1]; |
| 25 | + } |
| 26 | + if (k == 1) { |
| 27 | + return Math.min(nums1[start1], nums2[start2]); |
| 28 | + } |
| 29 | + var i = start1 + Math.min(len1, k / 2) - 1; |
| 30 | + var j = start2 + Math.min(len2, k / 2) - 1; |
| 31 | + if (nums1[i] > nums2[j]) { |
| 32 | + return findKth(nums1, start1, end1, nums2, j + 1, end2, k - (j + 1 - start2)); |
| 33 | + } else { |
| 34 | + return findKth(nums1, i + 1, end1, nums2, start2, end2, k - (i + 1 - start1)); |
| 35 | + } |
| 36 | + } |
| 37 | +} |
0 commit comments