4.2つの正の配列の中央値を見つけます
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
サイズmおよびnの2つの正の(小さいものから大きいものへの)配列nums1およびnums2が与えられます。これら2つの正の配列の中央値を見つけて返してください。
上級:この問題を解決するためにO(log(m + n))アルゴリズムを設計できますか?
例1:
入力:nums1 = [1,3]、nums2 = [2]
出力:2.0000
説明:結合された配列= [1,2,3]、中央値2
例2:
入力:nums1 = [1,2]、nums2 = [3,4]
出力:2.50000
説明:結合された配列= [1,2,3,4]、中央値(2 + 3)/ 2 = 2.5
例3:
入力:nums1 = [0,0]、nums2 = [0,0]
出力:0.00000
例4:
入力:nums1 = []、nums2 = [1]
出力:1.00000
例5:
入力:nums1 = [2]、nums2 = []
出力:2.00000
促す:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1 [i]、nums2 [i] <= 106
パス268,312提出691,163
コードは少し長く、アイデアは非常に単純です。
アイデア:
1。nums1が空の場合は、2番目の配列の中央値を見つけるだけです
。2。nums2が空の場合は、最初の配列
3の中央値を見つけるだけです。それらが空でない場合は、nums1とnums2をマージしてから、マージされた配列の中央値を見つけます
package 其他.每日一题;
import java.util.Arrays;
class Solution {
static public double findMedianSortedArrays(int[] nums1, int[] nums2) {
if(nums1.length==0)
return findMidArrays(nums2);
if(nums2.length==0)
return findMidArrays(nums1);
int[] hebing = hebing(nums1, nums2);
// System.out.println("合并好的数组:"+Arrays.toString(hebing));
return findMidArrays(hebing);
}
//合并数组
private static int[] hebing(int[] nums1, int[] nums2){
int len1 = nums1.length;
int len2 = nums2.length;
int[] newIntArray = new int[len1+len2];
int newIndex = 0;
int i = 0;
int j = 0;
while (len1!=0 && len2!=0){
if(nums1[i]>nums2[j]){
newIntArray[newIndex]=nums2[j];
len2--;
j++;
}else{
newIntArray[newIndex]=nums1[i];
len1--;
i++;
}
newIndex++;
}
// System.out.println(Arrays.toString(newIntArray));
//合并剩余的
if(len1!=0){
for (int k = i; k < nums1.length; k++) {
newIntArray[newIndex]=nums1[k];
newIndex++;
}
}
if(len2!=0){
for (int k = j; k < nums2.length; k++) {
newIntArray[newIndex]=nums2[k];
newIndex++;
}
}
// System.out.println(Arrays.toString(newIntArray));
return newIntArray;
}
//查找一个单独的数组中的中位数
private static double findMidArrays(int[] nums) {
if(nums.length==2){
return nums[0]+nums[1]==0?0:(nums[0]+nums[1]) / 2.0;
}
double midNumber = 0;
// int number = (nums.length-1)/2;
int numsLen = nums.length;
//有偶数个
if(numsLen%2==0){
int len = numsLen / 2;
midNumber = (nums[len] + nums[len-1]) / 2.0;
//有奇数个
}else{
numsLen = (nums.length/2)+1;
midNumber = nums[numsLen-1];
}
return midNumber;
}
public static void main(String[] args) {
System.out.println(findMedianSortedArrays(new int[]{
1,2,3,4,5,6},new int[]{
}));
System.out.println(findMedianSortedArrays(new int[]{
1,3},new int[]{
2}));
}
}