Учитывая входной массив, мы можем найти одну подматрицу, которая суммируется с 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;
}
Мой вопрос: есть ли у нас такое решение для смешанного набора чисел (как положительных, так и отрицательных чисел)?