hard

Count the number of islands on consecutive days.

Not assessed

Not assessed

Task description

The city of Codicity is located at the seaside. The city area comprises N plots located along a boulevard on one side of the city. Each plot is flat, but different plots have different heights above the sea level. The relative heights of the consecutive plots are given in the form of a non-empty array A of N integers.

The sea level changes constantly and many plots are sometimes under water. Water levels on consecutive days are given in the form of a non-empty array B of M integers.

A *slice* of array A is any pair of integers (P, Q) such that 0 ≤ P ≤ Q < N. An *island* is a slice of consecutive plots that rise above the waterâ€™s surface. The plots on either side of each island are under water. More precisely, if the level of the water is K, then an island is a slice (P, Q) in which the level of each plot A[P], A[P + 1], ..., A[Q] is greater than K. Both of the adjacent plots should also be under water; that is:

- P = 0 or A[P − 1] ≤ K
- Q = N − 1 or A[Q + 1] ≤ K

The goal is to calculate the number of islands on consecutive days.

For example, given the following arrays A and B:

We have the following number of islands on consecutive days:

- on the first day there is only 1 island: (0, 4),
- on the second day there are 2 islands: (0, 0) and (2, 4),
- on the third day there are 2 islands: (2, 2) and (4, 4),
- on the fourth day there aren't any islands,
- on the fifth day there are 2 islands: (0, 0) and (2, 4).

Write a function:

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

that, given a non-empty array A of N integers and a non-empty array B of M integers, returns a sequence consisting of M integers representing the number of islands on consecutive days.

Result array should be returned as an array of integers.

For example, given:

the function should return the array [1, 2, 2, 0, 2], as explained above.

Write an ** efficient** algorithm for the following assumptions:

- N and M are integers within the range [1..30,000];
- each element of arrays A, B is an integer within the range [0..100,000].

Copyright 2009–2018 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.

Solution

Programming language used C#

Total time used 2 minutes

Effective time used 2 minutes

Notes
*not defined yet*

Task timeline