【LintCode] 1844サブアレイ和がK IIに等しいです

整数の配列と整数kを考えると、あなたは合計kに等しい連続サブアレイの最小サイズを見つけて、その長さを返す必要があります。

そのような部分配列が存在しない場合は、-1を返します。

例1

Input: nums = [1,1,1,2] and k = 3
Output: 2

例2

Input: nums = [2,1,-1,4,2,-3] and k = 3
Output: 2

通知

整数NUMS [i]が0よりも低くすることができます

 

溶液1:O(N ^ 2)TLE

パブリック クラスソリューション{
     / ** 
     * @paramのNUMS:整数のリスト
     * @paramのK:整数
     * @return :和kに等しい連続サブアレイの最小長を表す、整数を戻す
      * / 
    パブリック int型 subarraySumEqualsKIIを(INT []、NUMS int型K){
         // ここにコードを記述は
        int型 []プレフィックス= 新しい INT [NUMS .LENGTH]。
        以下のためにINT ; I <nums.length; iが0 = I ++ ){
             場合(I == 0 ){
                接頭辞[I] = NUMS [I]。
                続け;
            }
            接頭辞[I] =接頭辞[I - 1] + NUMS [I]。
        }
        System.out.println(Arrays.toString(接頭辞));
        
        int型のres = Integer.MAX_VALUEで、
        以下のためにINT ; I <nums.length; iが0 = I ++ ){
             ためINT J = I; J <nums.length; J ++ ){
                 場合(I == 0 ){
                     場合(接頭辞[J] == k)は{
                        RES = Math.min(RES、J + 1 )。
                    }
                    続け;
                }
                もし(接頭辞[J] -接頭辞[I - 1] == k)は{
                    RES = Math.min(RES、J - I + 1 )。
                }
            }
        }
        戻る解像度== Integer.MAX_VALUEのか?-1 :RES。
    }
}

 

解決策2:

パブリック クラスソリューション{
     / ** 
     * @paramのNUMS:整数のリスト
     * @paramのK:整数
     * @return :、合計kに等しい連続サブアレイの示す最小長整数を返す
      * / 
    公共 int型 subarraySumEqualsKIIを(int型 [] NUMS、int型のk){
         // あなたのコードここに書く 
        地図<整数、整数>マップ= 新しいです HashMapの<> ();
        int型の合計= 0 ;
        int型のres = Integer.MAX_VALUEで、
        map.put( 0、-1 );
        
        以下のためにINT ; I <nums.length; iが0 = I ++ ){ + = NUMS [I]。
            もし(map.containsKey(和- K)){
                 // 実際I取得- map.get(和- k)に対する1つの指標 
                RES = Math.min(RESを、I - map.get(和- K))。
            }
            map.put(合計、I);
        }
        戻る解像度== Integer.MAX_VALUEのか?-1 :RES。
    }
}

 

おすすめ

転載: www.cnblogs.com/xuanlu/p/12515155.html