Skip to content

Commit f0825dc

Browse files
feat: add Longest Increasing Subsequence (#197)
* Added framework and some tests for longest_increasing_subsequence * Added test cases and fixed logic * fix: cargo fmt the code Co-authored-by: imp <imp07@qq.com>
1 parent 2454dfa commit f0825dc

File tree

4 files changed

+72
-1
lines changed

4 files changed

+72
-1
lines changed

DIRECTORY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
* [Fibonacci](https://github.com/TheAlgorithms/Rust/blob/master/src/dynamic_programming/fibonacci.rs)
2121
* [Knapsack](https://github.com/TheAlgorithms/Rust/blob/master/src/dynamic_programming/knapsack.rs)
2222
* [Longest Common Subsequence](https://github.com/TheAlgorithms/Rust/blob/master/src/dynamic_programming/longest_common_subsequence.rs)
23+
* [Longest Increasing Subsequence](https://github.com/TheAlgorithms/Rust/blob/master/src/dynamic_programming/longest_increasing_subsequence.rs)
2324
* [Maximum Subarray](https://github.com/TheAlgorithms/Rust/blob/master/src/dynamic_programming/maximum_subarray.rs)
2425
* General
2526
* [Convex Hull](https://github.com/TheAlgorithms/Rust/blob/master/src/general/convex_hull.rs)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ These are for demonstration purposes only.
3232
- [x] [0-1 Knapsack](./src/dynamic_programming/knapsack.rs)
3333
- [x] [Edit Distance](./src/dynamic_programming/edit_distance.rs)
3434
- [x] [Longest common subsequence](./src/dynamic_programming/longest_common_subsequence.rs)
35-
- [ ] Longest increasing subsequence
35+
- [x] [Longest increasing subsequence](./src/dynamic_programming/longest_increasing_subsequence.rs)
3636
- [x] [K-Means Clustering](./src/general/kmeans.rs)
3737
- [x] [Coin Change](./src/dynamic_programming/coin_change.rs)
3838
- [ ] Rod cut
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
pub fn longest_increasing_subsequence<T: Ord>(input_array: &[T]) -> &[T] {
2+
let length: usize = input_array.len();
3+
4+
//Handle the base cases
5+
if length <= 1 {
6+
return input_array;
7+
}
8+
9+
//Create the array to store the longest subsequence at each location
10+
let mut tracking_vec = vec![1; length];
11+
12+
//Iterate through the input and store longest subsequences at each location in the vector
13+
for i in (0..length - 1).rev() {
14+
if input_array[i] < input_array[i + 1] {
15+
tracking_vec[i] = tracking_vec[i + 1] + 1;
16+
}
17+
}
18+
19+
//Find the longest subsequence
20+
let mut max_index: usize = 0;
21+
let mut max_value: i32 = 0;
22+
for (index, value) in tracking_vec.iter().enumerate() {
23+
if value > &max_value {
24+
max_value = *value;
25+
max_index = index;
26+
}
27+
}
28+
29+
&input_array[max_index..max_index + max_value as usize]
30+
}
31+
32+
#[cfg(test)]
33+
mod tests {
34+
use super::longest_increasing_subsequence;
35+
36+
#[test]
37+
fn test_longest_increasing_subsequence() {
38+
//Base Cases
39+
let base_case_array: [i32; 0] = [];
40+
assert_eq!(&longest_increasing_subsequence(&base_case_array), &[]);
41+
assert_eq!(&longest_increasing_subsequence(&[1]), &[1]);
42+
43+
//Normal i32 Cases
44+
assert_eq!(
45+
&longest_increasing_subsequence(&[1, 2, 3, 4]),
46+
&[1, 2, 3, 4]
47+
);
48+
assert_eq!(
49+
&longest_increasing_subsequence(&[1, 2, 2, 3, 4, 2]),
50+
&[2, 3, 4]
51+
);
52+
assert_eq!(&longest_increasing_subsequence(&[5, 4, 3, 2, 1]), &[5]);
53+
assert_eq!(
54+
&longest_increasing_subsequence(&[5, 4, 3, 4, 2, 1]),
55+
&[3, 4]
56+
);
57+
58+
//Non-Numeric case
59+
assert_eq!(
60+
&longest_increasing_subsequence(&['a', 'b', 'c']),
61+
&['a', 'b', 'c']
62+
);
63+
assert_eq!(
64+
&longest_increasing_subsequence(&['d', 'c', 'd']),
65+
&['c', 'd']
66+
);
67+
}
68+
}

src/dynamic_programming/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ mod egg_dropping;
44
mod fibonacci;
55
mod knapsack;
66
mod longest_common_subsequence;
7+
mod longest_increasing_subsequence;
78
mod maximum_subarray;
89

910
pub use self::coin_change::coin_change;
@@ -13,4 +14,5 @@ pub use self::fibonacci::fibonacci;
1314
pub use self::fibonacci::recursive_fibonacci;
1415
pub use self::knapsack::knapsack;
1516
pub use self::longest_common_subsequence::longest_common_subsequence;
17+
pub use self::longest_increasing_subsequence::longest_increasing_subsequence;
1618
pub use self::maximum_subarray::maximum_subarray;

0 commit comments

Comments
 (0)