Longest Arithmetic Subsequence of Given Difference LeetCode solution in Rust

1
const RANGE_MIN: i32 = -10_000;
2
const RANGE_MAX: i32 = 10_000;
3

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

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0