LeetCode|4.兩個排序陣列的中位數(Java)
阿新 • • 發佈:2019-01-26
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 。
請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 O(log (m+n)) 。
示例 1:
nums1 = [1, 3] nums2 = [2] 中位數是 2.0
示例 2:
nums1 = [1, 2] nums2 = [3, 4] 中位數是 (2 + 3)/2 = 2.5正確程式碼:A4兩個排序陣列的中位數.java
package LeetCode; import java.util.ArrayList; public class A4兩個排序陣列的中位數 { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int n1 = nums1.length; int n2 = nums2.length; int i = 0; int j = 0; int k = 0; int[] nums = new int[n1 + n2]; while (n1 != 0 && n2 != 0) { // 公共長度先對比,小的放在新的數組裡 nums[k] = (nums1[i] < nums2[j]) ? nums1[i] : nums2[j]; if (nums1[i] < nums2[j]) { i++; k++; n1--; } else { j++; k++; n2--; } } if (n1 == 0) { // 如果nums1比較小,把nums2剩下的放入nums中 while ((n2--) != 0) { nums[k] = nums2[j]; j++; k++; } }else if (n2 == 0) { // 如果nums2比較小,把nums1剩下的放入nums中 while ((n1--) != 0) { nums[k] = nums1[i]; i++; k++; } } if ((nums1.length + nums2.length) % 2 == 0) { // 如果數字個數為偶數 return (nums[(nums1.length + nums2.length) / 2] + nums[(nums1.length + nums2.length) / 2 - 1]) /2.0; } else { // 如果數字個數為奇數 return nums[(nums1.length + nums2.length) / 2]; } } public static void main(String[] args) { int[] nums1 = {}; int[] nums2 = { 2, 3 }; A4兩個排序陣列的中位數 a4兩個排序陣列的中位數 = new A4兩個排序陣列的中位數(); System.out.println(a4兩個排序陣列的中位數.findMedianSortedArrays(nums1, nums2)); } }
需要注意的地方如下所示:
if (n1 == 0) { // 如果nums1比較小,把nums2剩下的放入nums中
while ((n2--) != 0) {
nums[k] = nums2[j];
j++;
k++;
}
} elseif(n2 == 0) { // 如果nums2比較小,把nums1剩下的放入nums中
while ((n1--) != 0) {
nums[k] = nums1[i];
i++;
k++;
}
}
*如果不加else,上面那個判斷n2--後,n2變成0,又會滿足下面那個判斷的條件。
return (nums[(nums1.length + nums2.length) / 2] + nums[(nums1.length
*減1是因為下標從0開始。
*除以2.0是為了讓結果不要取整。