Как работает второй цикл for, как будто он внутри первого цикла for? - PullRequest
1 голос
/ 18 октября 2019

Я пытался решить пример теста Codility с помощью вложенного цикла for, но он не работал достаточно хорошо. Затем я попробовал следующее решение, и я отлично работаю. Но я не имею представления о том, как работает второй цикл for во втором решении.

Первому решению не хватает производительности. https://app.codility.com/demo/results/training5Z4ZB8-385/

Второе решение - правильное, с хорошей производительностью. https://app.codility.com/demo/results/training4E8QZS-MQK/.

public class Solution5 {
    public int[] solution(int N, int[] A) {
        int[] counter = new int[N];
        int maxUpdate = 0, I, B = 0;
        for (int i = 0; i < A.length; i++) {
            I = A[i] - 1;
            if (A[i] >= 1 && A[i] <= N) {
                counter[I] = Math.max(B,counter[I]) + 1;
                maxUpdate = Math.max(maxUpdate, counter[I]);
            } else if (A[i] == (N + 1)) {
                B = maxUpdate;
            }
        }
        for (int i = 0; i < counter.length; i++) {
            counter[i] = Math.max(B, counter[i]);
        }
        return counter;
    }
}

1 Ответ

0 голосов
/ 18 октября 2019

Идея состоит в том, чтобы отложить операцию максимального количества счетчиков до конца. Как вы могли заметить, значение счетчика никогда не используется без предварительного вычисления max с помощью B, а B - это то, что максимальное значение (maxUpdate) было в последний раз, когда N+1 было найдено в A. ,maxUpdate всегда содержит максимальное значение в массиве счетчиков: оно начинается с нуля, как и все счетчики, и каждый раз, когда счетчик увеличивается, maxUpdate обновляется.

...