Описание
Это гарантирует , что сумма любых чисел в [-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 массив после ряда будет нерезким