Подмассив Sum II

Описание

Дано целое положительное число массива  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] - сумма [г]> = пуск) { 
                ++ г; 
            } 

            Разреш + = г - л; 
        } 

        Вернуть Рез; 
    } 
}

  

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

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