C++で最小Kの合計を持つ最短のサブアレイ
配列Aがあるとします。合計が少なくともKであるAの最短で空でない連続したサブ配列の長さを見つける必要があります。そのようなサブ配列がない場合は、-1を返します。
したがって、入力が[5,3、-2,2,1]のようで、k =6の場合、(5 + 3)> =6
を見るとわかるように、出力は2になります。これを解決するには、次の手順に従います-
-
n:=Aのサイズ
-
ans:=n + 1、j:=0、sum:=0
-
1つのdequedqを定義する
-
初期化i:=0の場合、i
-
i> 0の場合、-
-
A [i]:=A [i] + A [i-1]
-
-
A [i]> =Kの場合、-
-
ans:=最小のansとi + 1
-
-
(dqが空ではなく、A[i]-最初の要素A[dq]> =K)の場合、-
-
ans:=ansの最小値とiの最初の要素--dq
-
dqからフロント要素を削除します
-
-
while(dqが空ではなく、A [i] <=A [dq]の最後の要素、do-
-
dqから最後の要素を削除する
-
-
dqの最後にiを挿入します
-
-
return(ansがn + 1と同じ場合は-1、それ以外の場合はans)
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; class Solution { public: int shortestSubarray(vector<int> &A, int K) { int n = A.size(); int ans = n + 1; int j = 0; int sum = 0; deque<int> dq; for (int i = 0; i < n; i++) { if (i > 0) A[i] += A[i - 1]; if (A[i] >= K) { ans = min(ans, i + 1); } while (!dq.empty() && A[i] - A[dq.front()] >= K) { ans = min(ans, i - dq.front()); dq.pop_front(); } while (!dq.empty() && A[i] <= A[dq.back()]) dq.pop_back(); dq.push_back(i); } return ans == n + 1 ? -1 : ans; } }; main(){ Solution ob; vector<int> v = {5,3,-2,2,1}; cout << (ob.shortestSubarray(v, 6)); }
入力
{5,3,-2,2,1}, 6
出力
2
-
サブアレイの合計はC++でKに等しい
整数の配列と整数kがあるとすると、合計がkと同じ連続サブ配列の総数を見つける必要があります。したがって、nums配列が[1、1、1]で、kが2の場合、出力は2になります。 これを解決するには、次の手順に従います- sums、temp:=0、sums [0]:=1、ans:=0という1つのマップを定義します 0から配列のサイズまでの範囲のiの場合 temp:=temp + n [i] 合計にk– tempがある場合、 ans:=ans + sums [k --temp] sums[-temp]の値を1増やします 回答を返す 例(C ++) 理解を深めるために、次の実装を見
-
C++でのmを法とする最大サブアレイ合計
この問題では、サイズnと整数mの配列が与えられます。私たちのタスクは、C++でmを法とする最大のサブ配列の合計を見つけるプログラムを作成することです。 プログラムの説明 −ここでは、サブアレイのすべての要素の合計をmで割った値を求めます。 問題を理解するために例を見てみましょう 入力 −配列={4、9、2} m =6 出力 − 5 説明 −すべてのサブ配列と除算の余り {4}: 4%6 = 4 {9}: 9%6 = 3 {2}: 2%6 = 2 {4, 9}: 13%6 = 1 {9, 2}: 11%6 = 5 {4, 9, 2}: 15%6 = 3 この問題を解決するために、