Ссылка https://www.geeksforgeeks.org/find-subarray-with-given-sum-in-array-of-integers/ по какой-то причине я чувствую себя немного не в своей тарелке по этому поводу и не совсем понимаю, почему, как только вы найдете самый высокий индекс для (current_sum - target_sum) на карте, вы знаете, что если выначните с индекса, следующего непосредственно за индексом в массиве, и включите в него значения вплоть до текущего индекса, с которым вы столкнулись в массиве, чтобы у вас было решение для подмассива.
Я в значительной степени понимаю, что это потому, что если мы достигли точки в нашей итерации массива, мы увидели разницу между нашей текущей суммой и целевым числом, тогда, если мы удалим эту разницуиз суммы мы нашли подрешетку для решения, но я не могу понять, почему именно это. Например, что, если разница равна «2», но индекс, который мы сохранили на нашей карте, где мы в последний раз видели сумму «2», находится не сразу перед подрешеткой, ведущей к тому месту, где мы находимся сейчас, и предоставляет решение. Опять же, я вроде как понял, но был бы признателен за четкое и точное объяснение, поэтому у меня есть этот «ага» момент и более твердо понять его.
Также интересно, какая логика может привести меня к этому решению после решения этого вдругой способ только для натуральных чисел, а именно эффективное решение, описанное здесь https://www.geeksforgeeks.org/find-subarray-with-given-sum/.
Спасибо.
public static void subArraySum(int[] arr, int n, int sum) {
//cur_sum to keep track of cummulative sum till that point
int cur_sum = 0;
int start = 0;
int end = -1;
HashMap<Integer, Integer> hashMap = new HashMap<>();
for (int i = 0; i < n; i++) {
cur_sum = cur_sum + arr[i];
//check whether cur_sum - sum = 0, if 0 it means
//the sub array is starting from index 0- so stop
if (cur_sum - sum == 0) {
start = 0;
end = i;
break;
}
//if hashMap already has the value, means we already
// have subarray with the sum - so stop
if (hashMap.containsKey(cur_sum - sum)) {
start = hashMap.get(cur_sum - sum) + 1;
end = i;
break;
}
//if value is not present then add to hashmap
hashMap.put(cur_sum, i);
}
// if end is -1 : means we have reached end without the sum
if (end == -1) {
System.out.println("No subarray with given sum exists");
} else {
System.out.println("Sum found between indexes "
+ start + " to " + end);
}
}