1182. Shortest Distance to Target Color
You are given an array colors
, in which there are three colors: 1
, 2
and 3
.
You are also given some queries. Each query consists of two integers i
and c
, return the shortest distance between the given index i
and the target color c
. If there is no solution return -1
.
Example 1:
Input: colors = [1,1,2,1,3,2,2,3,3], queries = [[1,3],[2,2],[6,1]] Output: [3,0,3] Explanation: The nearest 3 from index 1 is at index 4 (3 steps away). The nearest 2 from index 2 is at index 2 itself (0 steps away). The nearest 1 from index 6 is at index 3 (3 steps away).
Example 2:
Input: colors = [1,2], queries = [[0,3]] Output: [-1] Explanation: There is no 3 in the array.
Constraints:
1 <= colors.length <= 5*10^4
1 <= colors[i] <= 3
1 <= queries.length <= 5*10^4
queries[i].length == 2
0 <= queries[i][0] < colors.length
1 <= queries[i][1] <= 3
Rust Solution
struct Solution;
impl Solution {
fn shortest_distance_color(colors: Vec<i32>, queries: Vec<Vec<i32>>) -> Vec<i32> {
let mut res = vec![];
let n = colors.len();
let mut color_indexes: Vec<Vec<usize>> = vec![vec![]; 3];
for i in 0..n {
let c = colors[i] as usize - 1;
color_indexes[c].push(i);
}
for q in queries {
let i = q[0] as usize;
let c = q[1] as usize - 1;
let indexes = &color_indexes[c];
match indexes.binary_search(&i) {
Ok(_) => {
res.push(0);
}
Err(j) => {
let mut min = std::usize::MAX;
if j > 0 {
min = min.min(i - indexes[j - 1]);
}
if j < indexes.len() {
min = min.min(indexes[j] - i);
}
if min == std::usize::MAX {
res.push(-1);
} else {
res.push(min as i32);
}
}
}
}
res
}
}
#[test]
fn test() {
let colors = vec![1, 1, 2, 1, 3, 2, 2, 3, 3];
let queries = vec_vec_i32![[1, 3], [2, 2], [6, 1]];
let res = vec![3, 0, 3];
assert_eq!(Solution::shortest_distance_color(colors, queries), res);
let colors = vec![1, 2];
let queries = vec_vec_i32![[0, 3]];
let res = vec![-1];
assert_eq!(Solution::shortest_distance_color(colors, queries), res);
}
Having problems with this solution? Click here to submit an issue on github.