Compare commits

...

2 Commits

Author SHA1 Message Date
li_chx 93d4b712d5
3761. 镜像对之间最小绝对距离 2026-04-20 12:02:39 +08:00
li_chx a467de459b
2078. 两栋颜色不同且距离最远的房子 2026-04-20 09:20:43 +08:00
1 changed files with 39 additions and 10 deletions

View File

@ -1,22 +1,51 @@
use std::collections::HashMap;
use std::collections::hash_map::Entry;
mod arr;
struct Solution {}
impl Solution {
pub fn max_distance(nums1: Vec<i32>, nums2: Vec<i32>) -> i32 {
fn get_rev(t: i32) -> i32 {
let mut t = t;
let mut ans = 0;
for i in 0..nums1.len() {
let mut idx = nums2.partition_point(|&x| x >= nums1[i]);
if idx == 0 {
continue;
}
idx -= 1;
ans = ans.max(idx as i32 - i as i32);
while t > 0 {
ans = ans * 10 + (t % 10);
t /= 10;
}
ans
}
pub fn min_mirror_pair_distance(nums: Vec<i32>) -> i32 {
let mut map = HashMap::<i32, Vec<usize>>::new();
for i in 0..nums.len() {
map.entry(nums[i]).or_insert_with(Vec::new).push(i);
}
let mut ans = 1e9 as usize;
for i in 0..nums.len() {
let x = nums[i];
match map.entry(Self::get_rev(x)) {
Entry::Occupied(arr) => {
//ans = ans.max(i.abs_diff(*arr.get().last().unwrap())).max(i.abs_diff(*arr.get().first().unwrap()));
let arr = arr.get();
if arr.len() == 1 {
if i != arr[0] && arr[0] > i {
ans = ans.min(arr[0] - i);
}
continue;
}
let idx = arr.partition_point(|y| i >= *y);
if idx < arr.len() {
if i != arr[idx] {
ans = ans.min(arr[idx] - i);
}
}
}
Entry::Vacant(_) => {}
}
}
if ans == 1e9 as usize { -1 } else { ans as i32 }
}
}
fn main() {
println!("{:?}", Solution::max_distance(vec![55,30,5,4,2],vec![100,20,10,10,5]));
println!("{:?}", Solution::min_mirror_pair_distance(vec![9,9]));
}