Leetcode-2つの正に順序付けられた配列の中央値を見つけます

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}));
    }

}


おすすめ

転載: blog.csdn.net/qq_17623363/article/details/108945861