LeetCode 4. Median of Two Sorted Arrays
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
방법: 이분법으로 찾기.
public class Solution {
private int median(int[] nums1, int[] nums2, int k) {
if (nums1.length == 0) return -1;
if (nums2.length == 0) return k;
int i=0, j=nums1.length-1;
while (i<=j) {
int m = (i+j)/2;
int n = k-m;
if (n < 0) j=m-1;
else if (n>nums2.length) i=m+1;
else if (n == nums2.length) {
if (nums2[n-1] <= nums1[m]) return m;
i=m+1;
} else if (n == 0) {
if (nums1[m] <= nums2[n]) return m;
j=m-1;
} else {
if (nums2[n-1] <= nums1[m] && nums1[m] <= nums2[n]) return m;
if (nums2[n-1] > nums1[m]) i=m+1;
if (nums1[m] > nums2[n]) j=m-1;
}
}
return -1;
}
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int n = nums1.length+nums2.length;
if (n % 2 == 0) {
int m1 = median(nums1, nums2, n/2-1);
int median = 0;
if (m1 != -1) median = nums1[m1]; else median = nums2[median(nums2, nums1, (n-1)/2)];
int m2 = median(nums1, nums2, n/2);
if (m2 != -1) median += nums1[m2]; else median += nums2[median(nums2, nums1, n/2)];
return (double)median/2;
} else {
int m = median(nums1, nums2, (n-1)/2);
if (m != -1) return nums1[m];
return nums2[median(nums2, nums1, (n-1)/2)];
}
}
}
방법2: 귀속.
public class Solution {
private int find(int[] a, int af, int at, int[] b, int k) {
if (af > at) return -1;
if (b.length == 0) {
if (af <= k && k <= at) return k;
return -1;
}
int m = (af + at) / 2;
int n = k - m;
if (n == b.length) {
if (b[n-1] <= a[m]) return m;
return find(a, m + 1, at, b, k);
}
if (n == 0) {
if (a[m] <= b[n]) return m;
return find(a, af, m - 1, b, k);
}
if (b[n - 1] <= a[m] && a[m] <= b[n]) return m;
if (b[n - 1] > a[m]) return find(a, m + 1, at, b, k);
return find(a, af, m - 1, b, k);
}
private int kth(int[] nums1, int[] nums2, int k) {
for(int i = 0; i < 2; i ++) {
int af = Math.max(0, k - nums2.length);
int at = Math.min(k, nums1.length - 1);
int m = find(nums1, af, at, nums2, k);
if (m != -1) return nums1[m];
int[] temp = nums1;
nums1 = nums2;
nums2 = temp;
}
return 0;
}
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
if ((nums1.length + nums2.length) % 2 == 1) {
int k = (nums1.length + nums2.length) / 2;
return kth(nums1, nums2, k);
} else {
int k = (nums1.length + nums2.length) / 2 - 1;
return (double)(kth(nums1, nums2, k) + kth(nums1, nums2, k + 1)) / 2;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Cognos 목록을 프롬프트에서 선택한 항목으로 오름차순 및 내림차순으로 정렬Cognos BI & Analytics에서 리스트의 정렬을 항목 지정 및 정렬 순서 지정으로 하고 싶을 때의 방법입니다. 정렬 항목 프롬프트에서 수량을 선택하고 정렬 순서 프롬프트에서 내림차순을 선택한 예입니다. 정...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.