Подмассив сумм целых чисел с отрицательными значениями целевого числа - PullRequest
0 голосов
/ 17 октября 2019

Ссылка 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); 
        } 

    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...