Описание
A
и интервал. Возвращает количество подмассивов, сумма которых находится в пределах заданного интервала.
Подмассива является частью происхождения массива с непрерывным индексом.
пример
Пример 1:
Input: A = [1, 2, 3, 4], start = 1, end = 3
Output: 4
Explanation: All possible subarrays: [1](sum = 1), [1, 2](sum = 3), [2](sum = 2), [3](sum = 3).
Пример 2:
Input: A = [1, 2, 3, 4], start = 1, end = 100 Output: 10 Explanation: Any subarray is ok.
Идеи:
O (N) алгоритм двух указателей
На самом деле нужны три руки, потому что она требует дополнительной записи, с которой начальная позиция плюс и> = пуск.
Для каждой из левой точки слева, справа две соответствующие точки, полученные right_start, right_end. Первый указывает, что крайний левый [влево, right_start] подмассив не меньше, чем начальная точка, которая указывает на то, что крайний правый [левый, right_end] суб-массив не больше, чем в конечной точке.
right_end - right_start + 1 является количество юридических подмассивов налево, как с левой точки.
Слева направо перечисления слева, и right_start, right_end также растет осталось только расти, поэтому время сложность O (N)
O (NlogN) дихотомии
И получение массива префикс, а затем для каждого префикса presum [вправо], мы требуем две точки left_start, left_end. Первое указывает на то, что крайний левый [left_start, вправо] подмассив и конечная точка не больше, чем последний указывает на то, что крайние правые [left_end, вправо] суб-массивы и точка начала не менее.
Перечень прав, мы можем искать, чтобы определить left_start, left_end в presum [0..right] половина на.
резюме
Приведенные выше два метода являются одинаковыми, все для конечной точки подмассива, дополнительно подтвердил, концы диапазона, в котором конец процесса перечисления, диапазон дополнительных конечных точек монотонна, то можно использовать два указателя O ( N), чтобы закончить.
Вы можете поставить две руки и всесторонний взгляд на дихотомии, но на этот раз сложность теории является то же самое, что нет большой необходимости. Эти два метода рекомендуют первый, менее сложный.
общественный класс Решение { / ** * @param A: целочисленный массив * @param начало: целое число * конец @param: целое число * @return: число возможных ответов * / общественный ИНТ subarraySumII (ИНТ [] A, INT начало, конец INT) { Int N = a.length; если (п == 0) { возвращения 0; } INT [] сумма = новый Int [п + 1]; INT I, L, R, разреш = 0; Сумма [0] = 0; для (I = 1; я <= п; ++ я) { сумма [I] = сумма [я - 1] + А [я - 1]; } Л = г = 0; для (I = 1; я <= п; ++ я) { в то время как (л <я && подводить [I] - сумма [л]> конец) { ++ л; } В то время как (г <я && подводить [I] - сумма [г]> = пуск) { ++ г; } Разреш + = г - л; } Вернуть Рез; } }