1182. Shortest Distance to Target Color
Last updated
Last updated
/**
* Time complexity :
* Space complexity :
*/
class Solution {
public List<Integer> shortestDistanceColor(int[] colors, int[][] queries) {
int[][] distMap = new int[4][colors.length];
for(int color = 1; color < 4; color++) {
distMap[color] = processColor(colors, color);
}
List<Integer> resultList = new ArrayList(queries.length);
for(int[] query: queries) {
int dist = distMap[query[1]][query[0]];
int result = (dist == Integer.MAX_VALUE)? -1: dist;
resultList.add(result);
}
return resultList;
}
private int[] processColor(int[] colors, int color) {
int[] dist = new int[colors.length];
processColorLeft(colors, color, dist);
processColorRight(colors, color, dist);
return dist;
}
private void processColorLeft(int[] colors, int color, int[] dist) {
int n = colors.length, prevIndex = -1;
for(int index = 0; index < n; index++) {
if(colors[index] == color) {
dist[index] = 0;
prevIndex = index;
} else if(prevIndex == -1) {
dist[index] = Integer.MAX_VALUE;
} else {
dist[index] = index - prevIndex;
}
}
}
private void processColorRight(int[] colors, int color, int[] dist) {
int n = colors.length, prevIndex = -1;
for(int index = n-1; index >= 0; index--) {
if(colors[index] == color) {
dist[index] = 0;
prevIndex = index;
} else if(prevIndex == -1) {
dist[index] = Math.min(dist[index], Integer.MAX_VALUE);
} else {
dist[index] = Math.min(dist[index], (prevIndex-index));
}
}
}
}