Skip to content

Commit 3fea1c4

Browse files
committed
misc
1 parent b326452 commit 3fea1c4

4 files changed

+138
-0
lines changed

Diff for: course-schedule-iv.rs

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Course Schedule IV
2+
impl Solution {
3+
pub fn check_if_prerequisite(n: i32, prerequisites: Vec<Vec<i32>>, queries: Vec<Vec<i32>>) -> Vec<bool> {
4+
let n = n as usize;
5+
let mut g = vec![vec![false; n]; n];
6+
for p in prerequisites.iter() {
7+
g[p[0] as usize][p[1] as usize] = true;
8+
}
9+
for k in 0..n {
10+
for i in 0..n {
11+
for j in 0..n {
12+
if g[i][k] && g[k][j] {
13+
g[i][j] = true; }}}}
14+
queries.into_iter().map(|q| g[q[0] as usize][q[1] as usize]).collect()
15+
}
16+
}

Diff for: largest-color-value-in-a-directed-graph.rs

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
impl Solution {
2+
pub fn largest_path_value(colors: String, edges: Vec<Vec<i32>>) -> i32 {
3+
let n = colors.len();
4+
let mut deg = vec![0; n];
5+
let mut head = vec![0; n];
6+
let mut es: Vec<(usize, usize)> = vec![(0,0)];
7+
for e in edges.iter() {
8+
deg[e[1] as usize] += 1;
9+
es.push((e[1] as usize, head[e[0] as usize]));
10+
head[e[0] as usize] = es.len()-1;
11+
}
12+
let mut q = vec![];
13+
for i in 0..n {
14+
if deg[i] == 0 {
15+
q.push(i); }}
16+
let mut i = 0;
17+
while i < q.len() {
18+
let u = q[i];
19+
i += 1;
20+
let mut j = head[u];
21+
while j != 0 {
22+
let v = es[j].0;
23+
j = es[j].1;
24+
deg[v] -= 1;
25+
if deg[v] == 0 { q.push(v); }
26+
}
27+
}
28+
if q.len() != n { return -1; }
29+
30+
let mut ans = 0;
31+
for c in b'a'..(b'z'+1) {
32+
let mut dp = vec![0; n];
33+
for &u in q.iter() {
34+
if colors.as_bytes()[u] == c { dp[u] += 1; }
35+
let mut j = head[u];
36+
while j != 0 {
37+
let v = es[j].0;
38+
j = es[j].1;
39+
dp[v] = dp[v].max(dp[u]);
40+
}
41+
}
42+
ans = dp.iter().fold(ans, |acc,&v| acc.max(v));
43+
}
44+
ans
45+
}
46+
}

Diff for: maximum-subarray-min-product.rs

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
impl Solution {
2+
pub fn max_sum_min_product(a: Vec<i32>) -> i32 {
3+
let mut st = vec![];
4+
let mut l: Vec<usize> = vec![0; a.len()];
5+
let mut r: Vec<usize> = vec![a.len(); a.len()];
6+
for (i, &x) in a.iter().enumerate() {
7+
while let Some(&j) = st.last() {
8+
if a[j] < x { break; }
9+
r[j] = i;
10+
st.pop();
11+
}
12+
if let Some(&j) = st.last() { l[i] = j+1; }
13+
st.push(i);
14+
}
15+
let sum: Box<[i64]> = std::iter::once(0).chain(a.iter().scan(0, |s,&y| { *s += y as i64; Some(*s) })).collect();
16+
let mut ans = 0;
17+
for i in 0..a.len() {
18+
ans = ans.max((sum[r[i]]-sum[l[i]]) * a[i] as i64);
19+
}
20+
(ans % 1000000007) as i32
21+
}
22+
}
23+
24+
///
25+
26+
impl Solution {
27+
pub fn max_sum_min_product(a: Vec<i32>) -> i32 {
28+
use std::{iter,usize::MAX};
29+
let sum: Box<[i64]> = iter::once(0).chain(a.iter().scan(0, |s,&y| { *s += y as i64; Some(*s) })).collect();
30+
let mut b: Vec<(usize,i32)> = a.into_iter().enumerate().collect();
31+
b.sort_unstable_by_key(|v| std::cmp::Reverse(v.1));
32+
let mut c: Vec<usize> = vec![MAX; b.len()];
33+
(b.iter().fold(0, |acc,&(i,v)| {
34+
let l = if i>0 && c[i-1]!=MAX { c[i-1] } else { i };
35+
let r = if i+1<b.len() && c[i+1]!=MAX { c[i+1] } else { i };
36+
c[l] = r;
37+
c[r] = l;
38+
acc.max((sum[r+1]-sum[l]) * v as i64)
39+
}) % 1000000007) as i32
40+
}
41+
}

Diff for: strange-printer-ii.rs

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Strange Printer II
2+
impl Solution {
3+
pub fn is_printable(grid: Vec<Vec<i32>>) -> bool {
4+
use std::collections::HashSet;
5+
fn cycle(u: usize, vis: &mut Vec<usize>, adj: &Vec<HashSet<usize>>) -> bool {
6+
vis[u] = 1;
7+
if adj[u].iter().any(|&v| vis[v] == 1 || vis[v] == 0 && cycle(v, vis, adj)) {
8+
return true;
9+
}
10+
vis[u] = 2;
11+
false
12+
}
13+
let nc = 61;
14+
let m = grid.len();
15+
let n = grid[0].len();
16+
let mut adj: Vec<HashSet<usize>> = vec![HashSet::new(); nc];
17+
for c in 1..nc {
18+
let mut x0 = m; let mut x1 = 0;
19+
let mut y0 = n; let mut y1 = 0;
20+
for i in 0..m {
21+
for j in 0..n {
22+
if grid[i][j] == c as i32 {
23+
x0 = x0.min(i);
24+
x1 = x1.max(i);
25+
y0 = y0.min(j);
26+
y1 = y1.max(j); }}}
27+
for i in x0..x1+1 {
28+
for j in y0..y1+1 {
29+
if grid[i][j] != c as i32 {
30+
adj[c].insert(grid[i][j] as usize); }}}
31+
}
32+
let mut vis = vec![0; nc];
33+
!(1..nc).any(|c| vis[c] == 0 && cycle(c, &mut vis, &adj))
34+
}
35+
}

0 commit comments

Comments
 (0)