Skip to content

Commit ac79b4f

Browse files
authored
feat: add rust solution to lc problem: No.2967 (#4505)
No.2967.Minimum Cost to Make Array Equalindromic
1 parent 9de9346 commit ac79b4f

File tree

3 files changed

+167
-0
lines changed

3 files changed

+167
-0
lines changed

solution/2900-2999/2967.Minimum Cost to Make Array Equalindromic/README.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,64 @@ function minimumCost(nums: number[]): number {
308308
}
309309
```
310310

311+
#### Rust
312+
313+
```rust
314+
impl Solution {
315+
pub fn minimum_cost(nums: Vec<i32>) -> i64 {
316+
use std::sync::Once;
317+
use std::cmp::min;
318+
319+
static INIT: Once = Once::new();
320+
static mut PS: Vec<i64> = Vec::new();
321+
322+
INIT.call_once(|| {
323+
let mut ps_local = Vec::with_capacity(2 * 100_000);
324+
for i in 1..=100_000 {
325+
let s = i.to_string();
326+
327+
let mut t1 = s.clone();
328+
t1 = t1.chars().rev().collect();
329+
ps_local.push(format!("{}{}", s, t1).parse::<i64>().unwrap());
330+
331+
let mut t2 = s[0..s.len() - 1].to_string();
332+
t2 = t2.chars().rev().collect();
333+
ps_local.push(format!("{}{}", s, t2).parse::<i64>().unwrap());
334+
}
335+
ps_local.sort();
336+
unsafe {
337+
PS = ps_local;
338+
}
339+
});
340+
341+
let mut nums = nums;
342+
nums.sort();
343+
344+
let mid = nums[nums.len() / 2] as i64;
345+
346+
let i = unsafe {
347+
match PS.binary_search(&mid) {
348+
Ok(i) => i,
349+
Err(i) => i,
350+
}
351+
};
352+
353+
let f = |x: i64| -> i64 {
354+
nums.iter().map(|&v| (v as i64 - x).abs()).sum()
355+
};
356+
357+
let mut ans = i64::MAX;
358+
359+
for j in i.saturating_sub(1)..=(i + 1).min(2 * 100_000 - 1) {
360+
let x = unsafe { PS[j] };
361+
ans = min(ans, f(x));
362+
}
363+
364+
ans
365+
}
366+
}
367+
```
368+
311369
<!-- tabs:end -->
312370

313371
<!-- solution:end -->

solution/2900-2999/2967.Minimum Cost to Make Array Equalindromic/README_EN.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,64 @@ function minimumCost(nums: number[]): number {
306306
}
307307
```
308308

309+
#### Rust
310+
311+
```rust
312+
impl Solution {
313+
pub fn minimum_cost(nums: Vec<i32>) -> i64 {
314+
use std::sync::Once;
315+
use std::cmp::min;
316+
317+
static INIT: Once = Once::new();
318+
static mut PS: Vec<i64> = Vec::new();
319+
320+
INIT.call_once(|| {
321+
let mut ps_local = Vec::with_capacity(2 * 100_000);
322+
for i in 1..=100_000 {
323+
let s = i.to_string();
324+
325+
let mut t1 = s.clone();
326+
t1 = t1.chars().rev().collect();
327+
ps_local.push(format!("{}{}", s, t1).parse::<i64>().unwrap());
328+
329+
let mut t2 = s[0..s.len() - 1].to_string();
330+
t2 = t2.chars().rev().collect();
331+
ps_local.push(format!("{}{}", s, t2).parse::<i64>().unwrap());
332+
}
333+
ps_local.sort();
334+
unsafe {
335+
PS = ps_local;
336+
}
337+
});
338+
339+
let mut nums = nums;
340+
nums.sort();
341+
342+
let mid = nums[nums.len() / 2] as i64;
343+
344+
let i = unsafe {
345+
match PS.binary_search(&mid) {
346+
Ok(i) => i,
347+
Err(i) => i,
348+
}
349+
};
350+
351+
let f = |x: i64| -> i64 {
352+
nums.iter().map(|&v| (v as i64 - x).abs()).sum()
353+
};
354+
355+
let mut ans = i64::MAX;
356+
357+
for j in i.saturating_sub(1)..=(i + 1).min(2 * 100_000 - 1) {
358+
let x = unsafe { PS[j] };
359+
ans = min(ans, f(x));
360+
}
361+
362+
ans
363+
}
364+
}
365+
```
366+
309367
<!-- tabs:end -->
310368

311369
<!-- solution:end -->
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
impl Solution {
2+
pub fn minimum_cost(nums: Vec<i32>) -> i64 {
3+
use std::cmp::min;
4+
use std::sync::Once;
5+
6+
static INIT: Once = Once::new();
7+
static mut PS: Vec<i64> = Vec::new();
8+
9+
INIT.call_once(|| {
10+
let mut ps_local = Vec::with_capacity(2 * 100_000);
11+
for i in 1..=100_000 {
12+
let s = i.to_string();
13+
14+
let mut t1 = s.clone();
15+
t1 = t1.chars().rev().collect();
16+
ps_local.push(format!("{}{}", s, t1).parse::<i64>().unwrap());
17+
18+
let mut t2 = s[0..s.len() - 1].to_string();
19+
t2 = t2.chars().rev().collect();
20+
ps_local.push(format!("{}{}", s, t2).parse::<i64>().unwrap());
21+
}
22+
ps_local.sort();
23+
unsafe {
24+
PS = ps_local;
25+
}
26+
});
27+
28+
let mut nums = nums;
29+
nums.sort();
30+
31+
let mid = nums[nums.len() / 2] as i64;
32+
33+
let i = unsafe {
34+
match PS.binary_search(&mid) {
35+
Ok(i) => i,
36+
Err(i) => i,
37+
}
38+
};
39+
40+
let f = |x: i64| -> i64 { nums.iter().map(|&v| (v as i64 - x).abs()).sum() };
41+
42+
let mut ans = i64::MAX;
43+
44+
for j in i.saturating_sub(1)..=(i + 1).min(2 * 100_000 - 1) {
45+
let x = unsafe { PS[j] };
46+
ans = min(ans, f(x));
47+
}
48+
49+
ans
50+
}
51+
}

0 commit comments

Comments
 (0)