Given an array of varying heights above sea level for adjacent plots, and the array of water levels on consecutive days, find the number of islands. An island is a slice of array such that plots adjacent to the boundary of the island are under water.
class Solution
{
public int[]
solution(int[] A, int[] B) {
return Arrays
.stream(B)
.map(water -> IntStream
.range(0, N)
.filter(j -> (A[j] > water)
&& (j == N - 1 || A[j + 1] <= water))
.map(i -> 1)
.sum()) .toArray();
}
}
For example,
given the following arrays A and B:
A[0] = 2
B[0] = 0
A[1] = 1
B[1] = 1
A[2] = 3
B[2] = 2
A[3] = 2
B[3] = 3
A[4] = 3
B[4] = 1
Solution:
result[0] = 1
result[1] = 2
result[2] = 2
result[3] = 0
result[4] = 2
For a water
level, the number of islands is just the sum of changes in the number of
islands as the water level is decreasing.
Optimized
solution:
class Solution
{
public int[]
solution(int[] A, int[] B) {
int limit = Math.max(maxLevel(A),
maxLevel(B));
int[] island = new int[limit + 2];
IntStream.range(0, A.length - 1)
.filter( j ->
A[j] > A[j+1])
.forEach(j -> {
island[A[j]] += 1;
island[A[j + 1]] -= 1;
});
island[A[A.length-1]] += 1;
IntStream.range(-limit, 0)
.forEach(i ->
island[-i] += island[-i+1]);
return Arrays.stream(B).map(water ->
island[water + 1]).toArray();
}
public int
maxLevel(int[] A) {
return
Arrays.stream(A).max().getAsInt();
}
}
// before
cumulation
island[0] = 0
island[1] = -1
island[2] = 0
island[3] = 2
island[4] = 0
// after
cumulation
island[0] = 1
island[1] = 1
island[2] = 2
island[3] = 2
island[4] = 0
result[0] = 1
result[1] = 2
result[2] = 2
result[3] = 0
result[4] = 2
No comments:
Post a Comment