Подмассив Sum Ближайший

Описание

Учитывая целый массив, найти подмассив с суммой ближе всего к нулю. Возвращает индексы первого числа и последнего числа.

Это гарантирует , что сумма любых чисел в  [-2 ^ {31}, 2 ^ {31} -1] [ - 2 3 1 , 2 3 1 - 1 ].

пример

Example1

Input: 
[-3,1,1,-3,5] 
Output: 
[0,2]
Explanation: [0,2], [1,3], [1,1], [2,2], [0,4]

Вызов

O (NlogN) час

класс Pair { 
    INT сумма; 
    INT индекс; 
    общественный пар (целое s, INT I) { 
        сумма = s; 
        Индекс = I; 
    } 
} 
    
Общественного класса Решение { 
    / ** 
     * @param НУМС: список А целых чисел 
     * @return: список А целых чисел включает в себя индекс первого числа 
     * и индекс последнего номера 
     * / 
    общественного ИНТ [] subarraySumClosest (ИНТ [] НУМС) { 
        INT [] разреш = новый INT [2]; 
        если (НУМС == NULL || nums.length == 0) { 
            возвращение разрешения; 
        } 
        
        INT Len = nums.length; 
        если (LEN == 1) { 
            разреш [0] = разреш [1] = 0;
            вернуться Рез;  
                ANS = суммирует [I] - .sum суммы [I-1 ] .sum;
        } 
        Пара [] = суммирует новая пара [LEN + 1]; 
        INT пред = 0; 
        суммы [0] = новая пара (0, 0); 
        для (INT I = 1; я <= Len; я ++) { 
            суммирует [I] = новая пара (пред + НУМС [I-1], я); 
            предыдущая = сумма [I] .sum; 
        } 
        Arrays.sort (суммы, новый Comparator <Pair> () { 
           общественного ИНТ сравнения (пары а, б Pair) { 
               возвращение a.sum - b.sum; 
           } 
        }); 
        INT анс = Integer.MAX_VALUE; 
        для (INT I = 1; я <= Len; я ++) { 
            
            если (ANS> сумма [I] - .sum сумма [I-1] .sum) {
                INT [] Темп = новый INT [] {суммы [I] .index - 1, суммы [я - 1] .index - 1}; 
                Arrays.sort (температура); 
                разреш [0] = темп [0] + 1; 
                разреш [1] = температура [1]; 
            } 
        } 
        
        Вернуть Рез; 
    } 
}

  Q: Почему нам нужно (0,0) из исходной пара? A: Мы сначала должны оглянуться назад на подмассиве этого урока, мы говорили о важном моменте знаний, называемом Приставка Sum Например, для массива [1,2,3 4], является его Приставка сумма [1,3,6,10] представляет число 1 и раньше, количество суммы первых два, число бывших 3 и 4 бывших в это время, если сумма числа вы хотите знать, от подмассива до индекса 1 и индекса 2 настоящей статьи (2 + 3), номер 1 и до вычитания суммы числа первых 3 = PrefixSum [2] - PrefixSum [0 ] = 6--1 = 5 между передней вы можете увидеть, где число х, и соответствующий индекс конкретно, наличие проблемы -1 + нижний индекс представляет собой число х-х - 1, нижний индекс х равен наоборот первое число х + 1, то вопрос, если вы хотите, чтобы вычислить индекс от 0 до 2 этого периода? То есть число 1 на номер 3, потому что будет иметь доступ к PrefixSum [-1], поэтому мы перешли к задней части PrefixSum в целом, бит 0 является число освобождены до и 0, то есть 0 => [0,1,3,6,10], то время, чтобы использовать PrefixSum [3] - PrefixSum [0], этот расчет еще более удобным. На данный момент, до того [я] PrefixSum я представляет собой сумму числа, что индекс в диапазоне от 0 ~ я-1 этого раздела, а затем оглянуться назад, почему нам нужна (0,0) пара его? Поскольку бывшие представлена ​​0,0 0 0 массив и число с числом п, становится префиксом Sum массив после ряда будет нерезким

рекомендация

отwww.cnblogs.com/FLAGyuri/p/12078525.html
рекомендация