Idea.
- Register all peaks.
- Maximum flag number is Math.sqrt(idxOfLastPeak - idxOfFirstPeak)+1
- Go through possible flag numbers, starting from maximum downwards. Check every time number of possible flags.
- If number of possible flags >= number tested (taken) than return number.
import static java.lang.Integer.min; class Solution { public int solution(int[] A) { int r = 0; final int N = A.length; int[] P = new int[N / 2]; int iP = -1; int max_flag_number; for (int i = 1; i < N - 1; i++) { if (A[i] > A[i - 1] && A[i] > A[i + 1]) { P[++iP] = i; } } if (iP == -1) return 0; if (iP == 0) return 1; max_flag_number = (int) (Math.sqrt(P[iP] - P[0])+1); for (int flag_taken = max_flag_number; flag_taken > 0; flag_taken--) { int possible_nb_flag = countFlag(P, flag_taken, iP); if (possible_nb_flag >= flag_taken) { r = min(possible_nb_flag, flag_taken); break; } } return r; } private int countFlag(int[] P, int space, int iP) { int r = 1; int start_flag; start_flag = P[0]; for (int i = 1; i <= iP; i++) { if (P[i] - start_flag >= space) { r++; start_flag = P[i]; } } return r; } }
Brak komentarzy:
Prześlij komentarz