Zadanie z codility.com - program działa zbyt wolno.

0

Witam,
Probowalem rozwiazac zadanie z codility.com w jezyku c. Niestety program dziala zbyt wolno. Prosze o rade jak go zmienic aby dzialal szybciej.
Oto tresc zadania:
Oto tresc pelnego zadania:
A small frog wants to get to the other side of a river. The frog is currently located at position 0, and wants to get to position X. Leaves fall from a tree onto the surface of the river.

You are given a non-empty zero-indexed array A consisting of N integers representing the falling leaves. A[K] represents the position where one leaf falls at time K, measured in seconds.

The goal is to find the earliest time when the frog can jump to the other side of the river. The frog can cross only when leaves appear at every position across the river from 1 to X. You may assume that the speed of the current in the river is negligibly small, i.e. the leaves do not change their positions once they fall in the river.

For example, you are given integer X = 5 and array A such that:

A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4
In second 6, a leaf falls into position 5. This is the earliest time when leaves appear in every position across the river.

Write a function:

int solution(int X, int A[], int N);

that, given a non-empty zero-indexed array A consisting of N integers and integer X, returns the earliest time when the frog can jump to the other side of the river.

If the frog is never able to jump to the other side of the river, the function should return −1.

For example, given X = 5 and array A such that:

A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4
the function should return 6, as explained above.

Assume that:

N and X are integers within the range [1..100,000];
each element of array A is an integer within the range [1..X].
Complexity:

expected worst-case time complexity is O(N);
expected worst-case space complexity is O(X), beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.

Kod funkcji:

int solution(int X, int A[], int N)
{
    // write your code in C99
    float y = 0, z = 1;
    int u = 0;
    while (z <= X) {
        u = 0;
        while (u < N) {
            if (z == A[u]) {
                if (u > y) {
                    y = u;
                    goto koniec;
                }
                goto koniec;
            }
            if (u == N - 1) {
                return (-1);
            }
            u++;
        }
    koniec:
        z++;
    }
    return (y);
}
}
0

Nie rozumiem. Masz znaleźć adres, a zwracasz int. Może przeklej zadanie, bo to co napisałeś się kupy nie trzyma. Aha, polecam tagi <code=c​>KOD</code>.

1

Przyznam, że nie wczytałem się w Twój kod, bo kombinacja bezsensownych nazw zmiennych u, y, z oraz instrukcji goto jest ponad moje siły.

Niemniej rozwiązanie spełniające warunki zadania jest mniej więcej takie:

  1. Trzymasz tablicę X elementów typu bool (czy tam int w C). Początkowo mają wartość false (0). Niech się nazywa pozycjeZLiscmi.
  2. Masz zmienną ilePozycjiJuzMam inicjalizowaną 0
  3. Lecisz po tablicy A i jeżeli masz np. wartość 4 to sprawdzasz czy pod pozycjeZLiscmi[4] jest false. Jeśli tak to zmieniasz na true i zwiększasz ilePozycjiJuzMam
  4. Kończysz gdy ilePozycjiJuzMam jest równe X
  5. Jeśli przeszedłeś przez całą tablicę A, a ilePozycjiJuzMam nadal jest mniejsze niż X, to znaczy że żabka nie przeskoczy.
0

A więc tak jako, że chociaż coś próbowałeś masz tutaj na zachętę kod z nazwami od autora poprzedniego postu, nie wiem w sumie czy działa, ale chyba tak.

int solution(int X, int A[], int N){

    int ilePozycjiJuzMam = 0;
    int pozycja = 0;
    int wartosc = -1;
    int *pozycjeZLiscmi = malloc(sizeof *pozycjeZLiscmi * (X + 1));

    for(int i = 0; i < N; ++i){
        pozycja = A[i] - 1;

        if(!pozycjeZLiscmi[pozycja] && pozycja < X){
            pozycjeZLiscmi[pozycja] = 1;
            ++ilePozycjiJuzMam;

            if(ilePozycjiJuzMam == X){
                wartosc = i;

                break;
            }
        }
    }

    free(pozycjeZLiscmi);

    return wartosc;
}
0

Na zachete sam napisalem na podstawie odpowiedzi. Naprawde dziala szybciej. Dziekuje.

  
int solution(int X, int A[], int N)
{
    // write your code in C99
    int pozycjeZLiscmi[X];
    int ilePozycjiJuzMam = 0, x = 0, liczbaZtablicyA = 0;
    for (x = 0; x < X; x++) {
        pozycjeZLiscmi[x] = 0;
    }
    x = 0;
    for (x = 0; x < N; x++) {
        liczbaZtablicyA = A[x] - 1;
        if (pozycjeZLiscmi[liczbaZtablicyA] == 0) {
            pozycjeZLiscmi[liczbaZtablicyA] = 1;
            ilePozycjiJuzMam++;
            if (ilePozycjiJuzMam == X) {
                return (x);
            }
        }
    }
    return (-1);
}

Najwazniejsze ze nauczylem sie nazywac zmienne a nie tylko x,y,z ktorych nikt pozniej nie rozumie:-)

0

lulz tablicy nie wyzerowałem

1 użytkowników online, w tym zalogowanych: 0, gości: 1