medianSlidingWindow-スライディングウィンドウの中央値

タイトル説明

中央値は、順序付けられたシーケンスの中央にある番号です。シーケンスのサイズが偶数の場合、中央値はありません。この場合、中央値は2つの中央値の平均です。

例えば:

[2,3,4]、中央値は3
[2,3]、中央値は(2 + 3)/ 2 = 2.5

numの配列が与えられると、左端から右端にスライドするサイズkのウィンドウがあります。ウィンドウにはk個の数字があり、ウィンドウが1ビット右に移動するたびに。あなたの仕事は、ウィンドウが動かされるたびに新しいウィンドウの
要素中央値を見つけて、それらの配列を出力することです。

例:

与えられたnums = [1,3、-1、-3,5,3,6,7]、およびk = 3。

ウィンドウ位置の中央値


[1 3 -1] -3 5 3 6 7 1
1 [3 -1 -3] 5 3 6 7 -1
1 3 [-1 -3 5] 3 6 7 -1
1 3 -1 [-3 5 3 ] 6 7 3
1 3 -1 -3 [5 3 6] 7 5
1 3 -1 -3 5 [3 6 7] 6

したがって、スライディングウィンドウ[1、-1、-1,3,5,6]の中央値配列が返されます。

促す:

kは常に有効であると想定できます。つまり、kは常に入力の空でない配列の要素数よりも少なくなります。
真の値から10 ^ -5以内の回答は、正解と見なされます。

問題解決のアイデア

ウィンドウ内の要素を並べ替え、中央値を見つけます

コードデモ

class Solution {
    
    
    public double[] medianSlidingWindow(int[] nums, int k) {
    
    
          //返回数组的长度
        double[] res=new double[nums.length-k+1];
        int[] copy = Arrays.copyOf(nums, k);
        Arrays.sort(copy);
        if(k%2!=0)
        {
    
    
            res[0]=copy[k/2];
            for(int i=k;i<nums.length;i++)
            {
    
    

                for(int j=0;j<k;j++)
                {
    
    
                    if(copy[j]==nums[i-k])
                    {
    
    
                        copy[j]=nums[i];
                        Arrays.sort(copy);
                        res[i-k+1]=copy[k/2];
                        break;
                    }
                }

            }
        }
        else
        {
    
    
            res[0]=((double) copy[k/2-1]+(double) copy[k/2])*1.0/2;
            for(int i=k;i<nums.length;i++)
            {
    
    
                for(int j=0;j<k;j++) {
    
    

                    if (copy[j] == nums[i - k]) {
    
    
                        copy[j] = nums[i];
                        Arrays.sort(copy);
                        res[i - k + 1] = ((double) copy[k / 2 - 1] + (double) copy[k / 2]) * 1.0 / 2;
                        break;
                    }
                }
            }
        }
        return res;
    }
}

効果

情報の
回答は成功しました:
実行時間:272ミリ秒、Javaユーザーの14.85%を打ち負かしました
メモリ消費量:40.6 MB、Javaユーザーの52.01%を打ち負かしました

合理化されたpsコード


class Solution {
    
    
    public double[] medianSlidingWindow(int[] nums, int k) {
    
    
          //返回数组的长度
        double[] res=new double[nums.length-k+1];
        int[] copy = Arrays.copyOf(nums, k);
        Arrays.sort(copy);

            res[0]=  k%2==1 ?  copy[k/2] : ((double)copy[k/2]+(double)copy[k/2-1])*1.0/2;
            for(int i=k;i<nums.length;i++)
            {
    
    

                for(int j=0;j<k;j++)
                {
    
    
                    if(copy[j]==nums[i-k])
                    {
    
    
                        copy[j]=nums[i];
                        Arrays.sort(copy);
                        res[i-k+1]=k%2==1 ?  copy[k/2] : ((double)copy[k/2]+(double)copy[k/2-1])*1.0/2;
                        break;
                    }
                }

            }

        return res;
    }
}

おすすめ

転載: blog.csdn.net/tangshuai96/article/details/113591752