Skip to content

Commit 86deec1

Browse files
committed
Runtime: 3 ms (Top 100.0%) | Memory: 3.00 MB (Top 86.96%)
1 parent 1b6ba29 commit 86deec1

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Runtime: 3 ms (Top 100.0%) | Memory: 3.00 MB (Top 86.96%)
2+
3+
const RANGE_MIN: i32 = -10_000;
4+
const RANGE_MAX: i32 = 10_000;
5+
6+
impl Solution {
7+
pub fn longest_subsequence(arr: Vec<i32>, difference: i32) -> i32 {
8+
let range = (RANGE_MAX - RANGE_MIN + 1) as usize;
9+
fn offset(i: i32) -> Option<usize> {
10+
if RANGE_MIN <= i && i <= RANGE_MAX {
11+
Some((i - RANGE_MIN) as usize)
12+
} else {
13+
None
14+
}
15+
}
16+
/// "Length when last seen"; longest subseq when we last saw that arr[i] value
17+
let mut lwls = vec![0_i32; range];
18+
let mut best = 1;
19+
for &a in arr.iter().rev() {
20+
let old = offset(a + difference).map(|i| lwls[i]).unwrap_or(0);
21+
let new_idx = offset(a).unwrap(); // safety: problem constraints
22+
let len = lwls[new_idx].max(old + 1);
23+
lwls[new_idx] = len;
24+
best = best.max(len);
25+
}
26+
best
27+
}
28+
}

0 commit comments

Comments
 (0)