入力配列が与えられると、これまでに見つかった合計と開始位置を追跡することにより、線形時間で合計が K (与えられた) になる単一のサブ配列を見つけることができます。現在の合計が K よりも大きくなると、現在の合計 <= K になるまで要素を開始位置から削除し続けます。
geeksforgeeks からサンプル コードを見つけ、そのような可能なセットをすべて返すように更新しました。ただし、入力配列が +ve の数値のみで構成されていることが前提です。
bool subArraySum(int arr[], int n, int sum)
{
int curr_sum = 0, start = 0, i;
bool found = false;
for (i = 0; i <= n; i++)
{
while (curr_sum > sum && start < i)
{
curr_sum = curr_sum - arr[start];
start++;
}
if (curr_sum == sum)
{
cout<<"Sum found in b/w indices: "<<start<<" & "<<(i-1)<<"\n";
curr_sum -= arr[start];
start++;
found = true;
}
// Add this element to curr_sum
if (i < n) {
curr_sum = curr_sum + arr[i];
}
}
return found;
}
私の質問は、数値の混合セット (正の数値と負の数値の両方) に対してもそのような解決策があるかどうかです。