|
| 1 | +A non-empty zero-indexed array A consisting of N integers is given. |
| 2 | + |
| 3 | +A peak is an array element which is larger than its neighbors. More precisely, it is an index P such that 0 < P < N − 1, A[P − 1] < A[P] and A[P] > A[P + 1]. |
| 4 | + |
| 5 | +For example, the following array A: |
| 6 | + |
| 7 | + A[0] = 1 |
| 8 | + A[1] = 2 |
| 9 | + A[2] = 3 |
| 10 | + A[3] = 4 |
| 11 | + A[4] = 3 |
| 12 | + A[5] = 4 |
| 13 | + A[6] = 1 |
| 14 | + A[7] = 2 |
| 15 | + A[8] = 3 |
| 16 | + A[9] = 4 |
| 17 | + A[10] = 6 |
| 18 | + A[11] = 2 |
| 19 | +has exactly three peaks: 3, 5, 10. |
| 20 | + |
| 21 | +We want to divide this array into blocks containing the same number of elements. More precisely, we want to choose a number K that will yield the following blocks: |
| 22 | + |
| 23 | +A[0], A[1], ..., A[K − 1], |
| 24 | +A[K], A[K + 1], ..., A[2K − 1], |
| 25 | +... |
| 26 | +A[N − K], A[N − K + 1], ..., A[N − 1]. |
| 27 | +What's more, every block should contain at least one peak. Notice that extreme elements of the blocks (for example A[K − 1] or A[K]) can also be peaks, but only if they have both neighbors (including one in an adjacent blocks). |
| 28 | + |
| 29 | +The goal is to find the maximum number of blocks into which the array A can be divided. |
| 30 | + |
| 31 | +Array A can be divided into blocks as follows: |
| 32 | + |
| 33 | +one block (1, 2, 3, 4, 3, 4, 1, 2, 3, 4, 6, 2). This block contains three peaks. |
| 34 | +two blocks (1, 2, 3, 4, 3, 4) and (1, 2, 3, 4, 6, 2). Every block has a peak. |
| 35 | +three blocks (1, 2, 3, 4), (3, 4, 1, 2), (3, 4, 6, 2). Every block has a peak. Notice in particular that the first block (1, 2, 3, 4) has a peak at A[3], because A[2] < A[3] > A[4], even though A[4] is in the adjacent block. |
| 36 | +However, array A cannot be divided into four blocks, (1, 2, 3), (4, 3, 4), (1, 2, 3) and (4, 6, 2), because the (1, 2, 3) blocks do not contain a peak. Notice in particular that the (4, 3, 4) block contains two peaks: A[3] and A[5]. |
| 37 | + |
| 38 | +The maximum number of blocks that array A can be divided into is three. |
| 39 | + |
| 40 | +Write a function: |
| 41 | + |
| 42 | +class Solution { public int solution(int[] A); } |
| 43 | + |
| 44 | +that, given a non-empty zero-indexed array A consisting of N integers, returns the maximum number of blocks into which A can be divided. |
| 45 | + |
| 46 | +If A cannot be divided into some number of blocks, the function should return 0. |
| 47 | + |
| 48 | +For example, given: |
| 49 | + |
| 50 | + A[0] = 1 |
| 51 | + A[1] = 2 |
| 52 | + A[2] = 3 |
| 53 | + A[3] = 4 |
| 54 | + A[4] = 3 |
| 55 | + A[5] = 4 |
| 56 | + A[6] = 1 |
| 57 | + A[7] = 2 |
| 58 | + A[8] = 3 |
| 59 | + A[9] = 4 |
| 60 | + A[10] = 6 |
| 61 | + A[11] = 2 |
| 62 | +the function should return 3, as explained above. |
| 63 | + |
| 64 | +Assume that: |
| 65 | + |
| 66 | +N is an integer within the range [1..100,000]; |
| 67 | +each element of array A is an integer within the range [0..1,000,000,000]. |
| 68 | +Complexity: |
| 69 | + |
| 70 | +expected worst-case time complexity is O(N*log(log(N))); |
| 71 | +expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments). |
0 commit comments