class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { if (nums2.length < nums1.length) return findMedianSortedArrays(nums2, nums1); int m = nums1.length, n = nums2.length; int k = (m + n + 1) / 2; int beg1 = 0, end1 = m; while (beg1 <= end1) { int i = beg1 + (end1 - beg1) / 2; int j = k - i; if (0 < i && nums2[j] < nums1[i - 1]) { end1 = i - 1; // Take too much } else if (i < m && nums1[i] < nums2[j - 1]) { beg1 = i + 1; // Take too little } else { int maxOfLeft = 0, minOfRight = 0; if (i == 0) maxOfLeft = nums2[j - 1]; else if (j == 0) maxOfLeft = nums1[i - 1]; else maxOfLeft = Math.max(nums1[i-1], nums2[j-1]); if (((m + n) & 1) == 1) return (double) maxOfLeft; if (i == m) minOfRight = nums2[j]; else if (j == n) minOfRight = nums1[i]; else minOfRight = Math.min(nums1[i], nums2[j]); return (maxOfLeft + minOfRight) / 2.0; } } return -1.0; } }