Trouvez le nombre maximum de drapeaux qui peuvent être mis sur les sommets des montagnes

Chaklad est le général Ashfaq Arafa:

Je travaillais avec un problème Codility ci-dessous,

Une matrice non vide A constitué par des entiers n est donné.

Un pic est un élément de réseau qui est plus grande que ses voisins. Plus précisément, it is an index P such that 0 < P < N − 1 and A[P − 1] < A[P] > A[P + 1].

For example, the following array A:

    A[0] = 1
    A[1] = 5
    A[2] = 3
    A[3] = 4
    A[4] = 3
    A[5] = 4
    A[6] = 1
    A[7] = 2
    A[8] = 3
    A[9] = 4
    A[10] = 6
    A[11] = 2

a exactement quatre pics: les éléments 1, 3, 5 et 10.

Vous allez sur un voyage à une chaîne de montagnes dont les sommets sont représentés par rapport tableau A, comme le montre une figure ci-dessous. Vous devez choisir combien de drapeaux vous devriez prendre avec vous. L'objectif est de définir le nombre maximum de drapeaux sur les sommets, selon certaines règles.

Les drapeaux ne peuvent être fixés sur des pics. De plus, si vous prenez des drapeaux K, la distance entre deux drapeaux doit être supérieur ou égal à K. La distance entre les indices P et Q est la valeur absolue | P - Q |.

Par exemple, compte tenu de la chaîne de montagnes représentée par tableau A, ci-dessus, avec N = 12, si vous prenez:

deux drapeaux, vous pouvez les régler sur les sommets 1 et 5; trois drapeaux, vous pouvez les régler sur les sommets 1, 5 et 10; quatre drapeaux, vous pouvez définir seulement trois drapeaux, sur les sommets 1, 5 et 10. Vous pouvez donc définir un maximum de trois drapeaux dans ce cas.

Ecrire une fonction:

class Solution { public int solution(int[] A); }

que, étant donné un ensemble non vide A de nombres entiers N, renvoie le nombre maximal de drapeaux qui peuvent être réglés sur les sommets de la matrice.

Par exemple, le tableau suivant A:

A[0] = 1
A[1] = 5
A[2] = 3
A[3] = 4
A[4] = 3
A[5] = 4
A[6] = 1
A[7] = 2
A[8] = 3
A[9] = 4
A[10] = 6
A[11] = 2

la fonction doit renvoyer 3, comme expliqué ci-dessus.

Suppose que:

N is an integer within the range [1..400,000];
each element of array A is an integer within the range [0..1,000,000,000].
Complexity:

expected worst-case time complexity is O(N);
expected worst-case space complexity is O(N) (not counting the storage required for input arguments).

Je marche à travers la solution ci-dessous,

public static int solution(int[] A) {

        int N = A.length;

        /*
         * P =  [1, 1, 3, 3, 5, 5, 10, 10, 10, 10, 10, -1]
         * */
        int[] P = nextPeak(A);

        int i = 1;
        int result = 0;

        while ((i - 1) * i <= N) {

            int index = 0;
            int flags = 0;

            while (index < N && flags < i) {

                /*
                 * P =  [1, 1, 3, 3, 5, 5, 10, 10, 10, 10, 10, -1]
                 * */
                index = P[index];

                if (index == -1) {
                    break;
                }

                flags += 1;
                index += i;
            }

            /*
             * maximize the number of flags for the whole segment
             * */
            result = Math.max(result, flags);
            i++;
        }

        return result;
    }


    /*
     * A = [1, 1, 3, 3, 5, 5, 10, 10, 10, 10, 10, -1]
     * */
    public static int[] nextPeak(int[] P) {

        int N = P.length;

        ArrayList<Integer> peaks = new ArrayList<Integer>();

        for (int i = 1; i < P.length - 1; i++) {

            if (P[i] > P[i - 1] && P[i] > P[i + 1]) {
                peaks.add(i);
            }
        }

        int[] A = new int[N];
        A[N - 1] = -1;


        for (int i = N - 2; i >= 0; i--) {

            if (peaks.contains(i)) {
                A[i] = i;
            } else {
                A[i] = A[i + 1];
            }
        }

        return A;
    }

En général, je comprends le calcul , mais ne vois pas où allons-nous accomplissons la condition if you take K flags, then the distance between any two flags should be greater than or equal to K.

J'imagine que cela est dans la whilecondition de (i-1)*i <= Nmais incapable de comprendre correctement. Est-ce que quelqu'un me expliquer à moi?

note :

Votre réponse est index += i;combinée à la condition flags < idans la whileboucle. Ils travaillent la solution dans le sens inverse: marche étapes K à la fois, insérer dans la plupart des drapeaux K.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=213589&siteId=1
conseillé
Classement