出于某种原因引用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);
}
}