問題文
ダイエットは、消費 calories[i]
にカロリーを i
目の日。
整数を考えると k
、のため のすべての連続したシーケンス k
(日calories[i], calories[i+1], ..., calories[i+k-1]
すべてのために 0 <= i <= n-k
)、彼らは見て T、のシーケンス中に消費される総カロリー k
日(calories[i] + calories[i+1] + ... + calories[i+k-1]
):
- 場合
T < lower
、彼らは彼らの食事に不振と1ポイントを失います。 - 場合
T > upper
、彼らは彼らの食事でよく行われ、1ポイントを獲得します。 - そうでなければ、彼らが正常に行われ、ポイントに変更はありません。
最初は、ダイエットはゼロポイントを持っています。以下のためにダイエットした後にダイエットが持っているポイントの合計数を返し calories.length
日。
合計ポイントが負であることができることに留意されたいです。
例1:
入力:カロリー= [1,2,3,4,5]、K = 1、下= 3、アッパー= 3
出力:0
説明:K = 1であるので、我々は別々に配列の各要素を考慮し、以下にそれを比較しますそして、上。
カロリー[0]、[1]カロリーは低いので、2点が失われ未満です。
カロリー[3]及び[4]カロリーはSO 2点が獲得された上部よりも大きいです。
例2:
入力:カロリー= [3,2]、K = 2、低級= 0、上側= 1つの
出力:1
説明:K = 2であるので、我々は長さのサブアレイ2考える
カロリー[0] +カロリー[1]>上部そう1ポイントが得られます。
例3:
入力:カロリー= [6,5,0,0]、K = 2、低級= 1、アッパー= 5
出力:0
説明:
カロリー[0] +カロリー[1]>上部ので1点が得られます。
下位<=カロリー[1] +カロリー[2] <=上側そう点で変化がありません。
カロリー[2] +カロリー[3] <低いので、1点が失われます。
制約:
1 <= k <= calories.length <= 10^5
0 <= calories[i] <= 20000
0 <= lower <= upper
問題のリンク
ビデオチュートリアル
あなたはここに詳細なビデオチュートリアルを見つけることができます
思考プロセス
これは簡単な問題であるが、1回のパスで正しくそれをコーディングするには少し難しいかもしれません。私たちは、上限と下限とそれをローリング合計を維持し、比較するためのスライディングウィンドウを使用することができます。
実装におけるいくつかの注意事項:
- 私たちは、開始と終了私は(スタート)インデックスを維持することにより、2つのポインタを使用して簡素化することができI - K(終わり)
- 私たちは代わりに二つの別々のループを持っていることの一つのループを持つことができます
ソリューション
スライドウィンドウ
1 公共の INT dietPlanPerformance(int型 []カロリー、int型 K、int型下、INT {上部) 2の 場合(カロリーは== NULL || calories.length == 0 ){ 3 リターン 0 。 4 } 5 6 INT rollingSum = 0 。 7 INTのパフォーマンス= 0 。 8 9が ため(int型 i = 0; iはcalories.length <; iは++ ){ 10 //常に右側にスライディング・ウィンドウに要素を追加する 11 rollingSum + = [I]カロリー。 12 // 初期値が 13 であれば(I <K - 1 ){ 14 続けます。 15 } 16 17 // 左の要素をポップする 18 場合(I> = K){ 19 rollingSum - =カロリー[I - K]。 20 } 21 であれば(rollingSum> 上側){ 22 の性能++ 。 23 } 24 もし(rollingSum < 低級){ 25 performance-- 。 26 } 27 } 28 29 リターン性能。 30 }
時間計算:O(N)は、一度配列を訪問しました
スペース複雑さ:O(1)余分なスペースは必要ありません
リファレンス
- 無し