Mam poniższe zadanie:
A non-empty zero-indexed array A consisting of N integers is given.
A monotonic_pair is a pair of integers (P, Q), such that 0 ≤ P ≤ Q < N and A[P] ≤ A[Q].
The goal is to find the monotonic_pair whose indices are the furthest apart. More precisely, we should maximize the value Q − P. It is sufficient to find only the distance.
For example, consider array A such that:
A[0] = 5
A[1] = 3
A[2] = 6
A[3] = 3
A[4] = 4
A[5] = 2
There are eleven monotonic_pairs: (0,0), (0, 2), (1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (3, 3), (3, 4), (4, 4), (5, 5). The biggest distance is 3, in the pair (1, 4).
Write a function:
class Solution { public int solution(int[] A); }
that, given a non-empty zero-indexed array A of N integers, returns the biggest distance within any of the monotonic_pairs.
For example, given:
A[0] = 5
A[1] = 3
A[2] = 6
A[3] = 3
A[4] = 4
A[5] = 2
the function should return 3, as explained above.
Assume that:
N is an integer within the range [1..300,000];
each element of array A is an integer within the range [−1,000,000,000..1,000,000,000].
Complexity:
expected worst-case time complexity is O(N);
expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.
Tłumaczenie, może nieco niedoskonałe:
Mamy daną niepustą, indeksowaną od zera tablicę tab, zawierającą n liczb całkowitych.
Pewna para_monotoniczna jest parą liczb całkowitych (p, q), takich że 0 <= p <= q < n
oraz tab[p] <= tab[q].
Celem zadania jest znaleźć 1 parę_monotoniczną, w której indeksy składników są najbardziej różne.
Bardziej precyzując, musimy znaleźć parę, która posiada największą różnicę pomiędzy indeksami
p i q (różnica = q - p).
Dla przykładu, rozważmy następującą tablicę tab:
tab[0] = 5
tab[1] = 3
tab[2] = 6
tab[3] = 3
tab[4] = 4
tab[5] = 2
Jest w tablicy tab 11 par_monotonicznych : (0,0),(0,2),(1,1),(1,2),(1,3),(1,4),(2,2),(3,3),(3,4),(4,4),(5,5).
Tutaj największa różnica pomiędzy indeksami pary wynosi 3(w parze (1,4)).
Napisz funkcję:
class Problem { public int rozwiazanie(int[] tab); }
taką, że mając daną tablicę tab zwraca największą wartość różnicy w parze.
Podczas rozwiązywania zadania należy wziąć pod uwagę możliwość, że:
*n jest integerem z zakresu [1...300,000],
*każdy element tablicy tab jest liczbą typu integer z zakresu [1 ... 1000,000,000].
Moje rozwiązanie:
public class Problem {
public int rozwiazanie(int[] t){
long start = System.nanoTime();
int wynik = -987654;
int[] roznice = new int[t.length];
for(int i = 0; i < t.length; i++){
for(int j = 0; j < t.length; j++){
if((i <= j) && (t[j] >= t[i])){
roznice[i] = j - i;
//System.out.print(roznice[i] + ", ");
}
}
}
wynik = roznice[0];
for(int i = 0; i < roznice.length; i++){
if(wynik < roznice[i]){
wynik = roznice[i];
}
}
long koniec = (System.nanoTime() - start) / 1000000000;
//System.out.println("Czas wykonania: " + koniec + " sekund");
return wynik;
}
Niestety, ten sposób jest za wolny... Przy 300000 indeksów i7 4 rdzenie wysiada. Jak inaczej można rozwiązać takie zadanie?