61 lines
1.6 KiB
Rust
61 lines
1.6 KiB
Rust
use std::collections::HashMap;
|
|
|
|
mod arr;
|
|
|
|
struct Solution {}
|
|
impl Solution {
|
|
pub fn solve_queries(nums: Vec<i32>, queries: Vec<i32>) -> Vec<i32> {
|
|
let mut mp = HashMap::<i32, Vec<usize>>::new();
|
|
let n = nums.len() as i32;
|
|
let mut queries = queries;
|
|
for i in 0..nums.len() {
|
|
if mp.contains_key(&nums[i]) {
|
|
mp.get_mut(&nums[i]).unwrap().push(i);
|
|
} else {
|
|
mp.insert(nums[i], vec![i]);
|
|
}
|
|
}
|
|
for i in 0..queries.len() {
|
|
let arr = mp.get(&nums[queries[i] as usize]).unwrap();
|
|
if arr.len() == 1 {
|
|
queries[i] = -1;
|
|
continue;
|
|
}
|
|
|
|
let idx = arr.partition_point(|&x| x <= queries[i] as usize);
|
|
if arr.len() == 2 {
|
|
queries[i] = (arr[idx % arr.len()] as i32).abs_diff(queries[i]) as i32;
|
|
queries[i] = queries[i].min(n - queries[i]);
|
|
continue;
|
|
}
|
|
let mut a = arr[idx % arr.len()].abs_diff(queries[i] as usize) as i32;
|
|
let mut b = arr[(idx + arr.len() - 2) % arr.len()].abs_diff(queries[i] as usize) as i32;
|
|
a = a.min(n - a);
|
|
b = b.min(n - b);
|
|
queries[i] = a.min(b);
|
|
}
|
|
queries
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
println!(
|
|
"{:?}",
|
|
Solution::solve_queries(vec![12, 19, 12, 8, 12, 10], vec![0, 5, 3, 1])
|
|
);
|
|
}
|
|
/*
|
|
|
|
|
|
[[-86, 2], [-76, 2], [-46, 2]]
|
|
[-84, -59]
|
|
[[0, 2, 29], [0, 2, 10], [0, 2, 10]]
|
|
10
|
|
|
|
|
|
-8 -6 -4 -2
|
|
-86 -74 -46 -29
|
|
-84 -60 -59
|
|
-7 -5 -3
|
|
*/
|