Skip to content

Commit 8e3f9ef

Browse files
committed
Rust
1 parent be1bdf5 commit 8e3f9ef

11 files changed

+294
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Change Minimum Characters to Satisfy One of Three Conditions
2+
impl Solution {
3+
pub fn min_characters(a: String, b: String) -> i32 {
4+
let na = a.as_bytes().len();
5+
let nb = b.as_bytes().len();
6+
let mut ca = vec![0; 26];
7+
let mut cb = vec![0; 26];
8+
for c in a.into_bytes().iter() { ca[(c-b'a') as usize] += 1; }
9+
for c in b.into_bytes().iter() { cb[(c-b'a') as usize] += 1; }
10+
let mut pa = 0;
11+
let mut pb = 0;
12+
let mut ans = na-ca[25]+nb-cb[25];
13+
for i in 0..25 {
14+
pa += ca[i];
15+
pb += cb[i];
16+
ans = ans.min(na-pa+pb).min(nb-pb+pa).min(na-ca[i]+nb-cb[i]);
17+
}
18+
ans as i32
19+
}
20+
}

describe-the-painting.rs

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Describe the Painting
2+
impl Solution {
3+
pub fn split_painting(segments: Vec<Vec<i32>>) -> Vec<Vec<i64>> {
4+
use std::collections::BTreeMap;
5+
let mut c = BTreeMap::new();
6+
for seg in segments.into_iter() {
7+
c.insert(seg[0], c.get(&seg[0]).unwrap_or(&0)+seg[2] as i64);
8+
c.insert(seg[1], c.get(&seg[1]).unwrap_or(&0)-seg[2] as i64);
9+
}
10+
let mut ans = vec![];
11+
let mut i = 0;
12+
let mut sum = 0;
13+
for (k, v) in c.into_iter() {
14+
if sum > 0 {
15+
ans.push(vec![i as i64, k as i64, sum]);
16+
}
17+
sum += v;
18+
i = k;
19+
}
20+
ans
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Longest Word in Dictionary through Deleting
2+
impl Solution {
3+
pub fn find_longest_word(s: String, dictionary: Vec<String>) -> String {
4+
let mut p = vec![0; dictionary.len()];
5+
let ws: Vec<&[u8]> = dictionary.iter().map(|s| s.as_bytes()).collect();
6+
for &c in s.as_bytes().iter() {
7+
ws.iter().enumerate().for_each(|(i,w)| if p[i] < w.len() && w[p[i]] == c {p[i]+=1;});
8+
}
9+
String::from_utf8_lossy(
10+
ws.into_iter().zip(p.iter()).fold(&[], |acc,(w,&i)|
11+
if w.len()==i && (w.len()>acc.len() || w.len()==acc.len() && w < acc) {w} else {acc})
12+
).into_owned()
13+
}
14+
}

maximum-genetic-difference-query.rs

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Maximum Genetic Difference Query
2+
impl Solution {
3+
pub fn max_genetic_difference(parents: Vec<i32>, queries: Vec<Vec<i32>>) -> Vec<i32> {
4+
const LN: usize = 18;
5+
fn dfs(u: usize, dep: i32, fenwick: &mut Vec<i32>, g: &Vec<Vec<usize>>, q: &Vec<Vec<(i32, usize)>>, ans: &mut Vec<i32>) {
6+
let mut x = u;
7+
while x < 1<<LN { fenwick[x] += 1; x |= x+1; }
8+
for qu in q[u].iter() {
9+
let mut c = dep;
10+
x = 0;
11+
for i in (0..LN).rev().map(|i| 1<<i) {
12+
let c1 = fenwick[x+i-1];
13+
if c1 < c && ((qu.0 & i as i32) == 0 || c1 == 0) {
14+
c -= c1;
15+
x += i;
16+
} else {
17+
c = c1
18+
}
19+
}
20+
ans[qu.1] = qu.0 ^ x as i32;
21+
}
22+
for &v in g[u].iter() {
23+
dfs(v, dep+1, fenwick, g, q, ans);
24+
}
25+
x = u;
26+
while x < 1<<LN { fenwick[x] -= 1; x |= x+1; }
27+
}
28+
29+
let n = parents.len();
30+
let mut root = 0;
31+
let mut g = vec![vec![]; n];
32+
let mut q = vec![vec![]; n];
33+
for (i, p) in parents.into_iter().enumerate() {
34+
if p == -1 { root = i; }
35+
else { g[p as usize].push(i as usize); }
36+
}
37+
for (i, que) in queries.iter().enumerate() {
38+
q[que[0] as usize].push((que[1], i));
39+
}
40+
let mut fenwick = vec![0; 1<<LN];
41+
let mut ans = vec![0; queries.len()];
42+
dfs(root, 1, &mut fenwick, &g, &q, &mut ans);
43+
ans
44+
}
45+
}

maximum-number-of-points-with-cost.rs

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Maximum Number of Points with Cost
2+
impl Solution {
3+
pub fn max_points(points: Vec<Vec<i32>>) -> i64 {
4+
let n = points[0].len();
5+
let mut f = vec![0i64; n];
6+
let mut g = vec![0i64; n];
7+
for a in points.iter() {
8+
let mut mx = std::i64::MIN;
9+
for i in 0..n {
10+
mx = mx.max(f[i]+i as i64);
11+
g[i] = mx+a[i] as i64-i as i64;
12+
}
13+
mx = std::i64::MIN;
14+
for i in (0..n).rev() {
15+
mx = mx.max(f[i]-i as i64);
16+
g[i] = g[i].max(mx+a[i] as i64+i as i64);
17+
}
18+
f.clone_from_slice(&g);
19+
}
20+
f.iter().fold(0, |acc,v| acc.max(*v))
21+
}
22+
}
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
impl Solution {
2+
pub fn find_maximum_xor(nums: Vec<i32>) -> i32 {
3+
use std::collections::HashSet;
4+
use std::iter::FromIterator;
5+
(0..32).rev().fold(0, |acc,i| {
6+
let m = acc | 1<<i;
7+
let s: HashSet<i32> = HashSet::from_iter(nums.iter().map(|x| x&m));
8+
if s.iter().any(|&x| s.contains(&(x^m))) {m} else {acc}
9+
})
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Minimum Cost to Reach Destination in Time
2+
impl Solution {
3+
pub fn min_cost(max_time: i32, edges: Vec<Vec<i32>>, passing_fees: Vec<i32>) -> i32 {
4+
use std::cmp::Reverse;
5+
use std::collections::BinaryHeap;
6+
let n = passing_fees.len();
7+
let mut g = vec![vec![]; n];
8+
for e in edges.into_iter() {
9+
g[e[0] as usize].push((e[1], e[2]));
10+
g[e[1] as usize].push((e[0], e[2]));
11+
}
12+
let mut dist = vec![max_time+1; n];
13+
let mut h: BinaryHeap<Reverse<(i32, i32, i32)>> = BinaryHeap::from(vec![Reverse((passing_fees[0], 0, 0))]);
14+
while let Some(Reverse((fee, c, t))) = h.pop() {
15+
let c = c as usize;
16+
if dist[c] <= t { continue; }
17+
dist[c] = t;
18+
if c == n-1 { return fee; }
19+
for &e in g[c].iter() {
20+
if t+e.1 < dist[e.0 as usize] {
21+
h.push(Reverse((fee+passing_fees[e.0 as usize], e.0, t+e.1)));
22+
}
23+
}
24+
}
25+
-1
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Number of Subarrays with Bounded Maximum
2+
impl Solution {
3+
pub fn num_subarray_bounded_max(nums: Vec<i32>, left: i32, right: i32) -> i32 {
4+
let mut ans = 0;
5+
let mut cnt = 0;
6+
let mut bgn = 0;
7+
for (i, x) in nums.into_iter().enumerate() {
8+
if x > right {
9+
cnt = 0;
10+
bgn = i+1;
11+
} else {
12+
if x >= left {
13+
cnt = i+1-bgn;
14+
}
15+
ans += cnt;
16+
}
17+
}
18+
ans as i32
19+
}
20+
}
+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Number of Visible People in a Queue
2+
impl Solution {
3+
pub fn can_see_persons_count(heights: Vec<i32>) -> Vec<i32> {
4+
let mut st: Vec<usize> = vec![];
5+
let mut ans = vec![0; heights.len()];
6+
for (i, &h) in heights.iter().enumerate() {
7+
while st.len() > 0 && heights[*st.last().unwrap()] <= h {
8+
ans[st.pop().unwrap()] += 1;
9+
}
10+
if let Some(x) = st.last() {
11+
ans[*x] += 1;
12+
}
13+
st.push(i);
14+
}
15+
ans
16+
}
17+
}
18+
19+
///
20+
21+
impl Solution {
22+
pub fn can_see_persons_count(heights: Vec<i32>) -> Vec<i32> {
23+
let mut st = vec![];
24+
let mut ans = vec![0; heights.len()];
25+
for (i, &h) in heights.iter().enumerate().rev() {
26+
let c = st.len();
27+
while st.len() > 0 && *st.last().unwrap() <= h {
28+
st.pop();
29+
}
30+
ans[i] = (c-st.len()) as i32 + if st.is_empty() {0} else {1};
31+
st.push(h);
32+
}
33+
ans
34+
}
35+
}
36+
37+
///
38+
39+
impl Solution {
40+
pub fn can_see_persons_count(heights: Vec<i32>) -> Vec<i32> {
41+
let mut st = vec![];
42+
let mut ans = heights.into_iter().rev().map(|h| {
43+
let c = st.len();
44+
st.truncate(st.iter().rposition(|&x| x > h).and_then(|i| Some(i+1)).unwrap_or(0));
45+
st.push(h);
46+
(c+1-st.len()) as i32 + if st.len()==1 {0} else {1}
47+
}).collect::<Vec<_>>();
48+
ans.reverse();
49+
ans
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Painting a Grid With Three Different Colors
2+
impl Solution {
3+
pub fn color_the_grid(m: i32, n: i32) -> i32 {
4+
const MOD: i32 = 1000000007;
5+
let ns = 3<<m-1;
6+
let mut tr = vec![vec![]; ns];
7+
for i in 0..ns {
8+
for j in 0..ns {
9+
let mut i0 = i>>m-1;
10+
let mut j0 = j>>m-1;
11+
let mut ok = i0 != j0;
12+
for k in 0..m-1 {
13+
i0 = (i0+1+(i>>k&1))%3;
14+
j0 = (j0+1+(j>>k&1))%3;
15+
ok = ok && i0 != j0;
16+
}
17+
if ok { tr[i].push(j); }
18+
}
19+
}
20+
let mut f = vec![1; ns];
21+
let mut g = vec![0; ns];
22+
for i in 1..n {
23+
for j in 0..ns { g[j] = 0; }
24+
for j in 0..ns {
25+
for &k in tr[j].iter() {
26+
g[k] = (f[j]+g[k])%MOD;
27+
}
28+
}
29+
for j in 0..ns { f[j] = g[j]; }
30+
}
31+
f.iter().fold(0, |acc,v| (acc+v)%MOD)
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// The Number of the Smallest Unoccupied Chair
2+
impl Solution {
3+
pub fn smallest_chair(mut times: Vec<Vec<i32>>, target_friend: i32) -> i32 {
4+
use std::cmp::Reverse;
5+
use std::collections::{BinaryHeap,BTreeSet};
6+
let start = times[target_friend as usize][0];
7+
times.sort_unstable_by_key(|t| t[0]);
8+
let mut used: BinaryHeap<Reverse<(i32, i32)>> = BinaryHeap::new();
9+
let mut free: BinaryHeap<Reverse<i32>> = BinaryHeap::new();
10+
let mut allo = 0;
11+
let mut sit = 0;
12+
for t in times.into_iter() {
13+
if start < t[0] { break; }
14+
while let Some(Reverse(x)) = used.peek() {
15+
if t[0] < x.0 { break; }
16+
free.push(Reverse(x.1));
17+
used.pop();
18+
}
19+
if let Some(Reverse(x)) = free.pop() {
20+
sit = x;
21+
} else {
22+
sit = allo;
23+
allo += 1;
24+
}
25+
used.push(Reverse((t[1], sit)));
26+
}
27+
sit
28+
}
29+
}

0 commit comments

Comments
 (0)