1. 程式人生 > >LeetCode|4.兩個排序陣列的中位數(Java)

LeetCode|4.兩個排序陣列的中位數(Java)

給定兩個大小為 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

+ nums2.length) / 2 - 1]) / 2.0;

*減1是因為下標從0開始。

*除以2.0是為了讓結果不要取整。