From 36ecf4affa1163d17b1e283ea64643a86bdbda7a Mon Sep 17 00:00:00 2001 From: boolpurist Date: Tue, 6 Aug 2024 13:23:45 +0200 Subject: [PATCH] Improved runtime by about 45 ms for leetcode submission Adjusted start interval from all jumps steps to only jumps height which exceed the greatest vested index. This adjustment also removed one addition statement --- src/lib.rs | 61 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 2bed49c..2d6af95 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,8 +1,8 @@ pub struct Solution; // Copy from here for submitting this solution to leet code - use std::collections::VecDeque; + impl Solution { pub fn can_jump(nums: Vec) -> bool { Solution::idiom_can_jump(&nums) @@ -35,7 +35,7 @@ impl Solution { // Using a dequeue ensures that every index is visited let mut next_nodes = VecDeque::from([(0, nums[0])]); // index visited yet - let mut greatest_visted_indices = -1; + let mut greatest_visited_indices = -1; if Self::check_with_target_value(target_val, 0) { return true; } @@ -45,18 +45,18 @@ impl Solution { if Self::check_with_target_value(target_val, max_jump_height) { return true; } - // It can start at 1 because the every index was checked in previous path walking - for next_to_check in 1..=steps { - let to_add = index + next_to_check; - // Going left to right and using a dequeue - // for subsequent path walking ensures that - // every index before to_add was visited. - if greatest_visted_indices >= to_add { - // already visited this index - continue; + // Going left to right and using a dequeue for FIFO access, + // all indices are visited + let start_point = greatest_visited_indices + 1; + // It can start at greatest_visited_indices + 1 because the every index was checked + // in previous iterations. + // If the max_jump_height is lower than the start_point + // then there is not new index to be discovered + for to_add in start_point..=max_jump_height { + if to_add > greatest_visited_indices { + next_nodes.push_back((to_add, nums[to_add as usize])); + greatest_visited_indices = to_add; } - greatest_visted_indices = to_add; - next_nodes.push_front((to_add, nums[to_add as usize])); } } false @@ -124,6 +124,41 @@ mod testing { let expected = true; assert_case(given, expected); } + #[test] + // Taken from a failed submission + fn very_complex_cant_jump_complex_array() { + let given = vec![ + 3, 6, 2, 7, 1, 2, 8, 5, 7, 8, 3, 6, 4, 4, 3, 7, 5, 8, 4, 4, 5, 5, 4, 7, 8, 7, 8, 1, 2, + 4, 8, 1, 6, 3, 6, 5, 3, 4, 6, 1, 1, 4, 7, 6, 1, 7, 7, 4, 8, 1, 1, 3, 3, 1, 7, 3, 4, 6, + 2, 5, 8, 4, 1, 8, 4, 6, 4, 7, 5, 5, 6, 2, 2, 5, 2, 7, 5, 1, 7, 5, 8, 1, 1, 6, 4, 6, 8, + 3, 7, 1, 1, 8, 2, 1, 3, 2, 5, 5, 5, 4, 7, 4, 5, 5, 7, 1, 7, 6, 6, 6, 6, 5, 1, 4, 5, 5, + 2, 3, 7, 5, 8, 4, 2, 8, 3, 5, 7, 2, 1, 1, 3, 2, 8, 2, 2, 6, 2, 5, 7, 2, 3, 8, 1, 7, 7, + 3, 2, 4, 6, 6, 5, 1, 5, 7, 2, 1, 6, 4, 4, 5, 3, 4, 8, 2, 7, 4, 2, 1, 2, 1, 4, 8, 2, 3, + 7, 2, 1, 6, 5, 8, 8, 6, 6, 4, 5, 4, 4, 5, 1, 6, 5, 2, 3, 5, 6, 4, 6, 7, 4, 8, 4, 6, 4, + 7, 5, 8, 6, 4, 3, 7, 4, 2, 3, 4, 8, 2, 1, 2, 5, 1, 8, 4, 6, 7, 4, 1, 1, 8, 8, 7, 7, 7, + 3, 1, 2, 7, 2, 4, 5, 8, 5, 8, 2, 8, 3, 3, 6, 5, 5, 6, 3, 2, 5, 8, 5, 4, 6, 2, 5, 8, 7, + 8, 7, 8, 6, 5, 6, 1, 3, 3, 4, 4, 6, 4, 5, 5, 5, 8, 5, 4, 4, 1, 5, 2, 8, 8, 7, 3, 7, 3, + 7, 2, 4, 5, 2, 6, 2, 6, 5, 8, 4, 3, 4, 7, 4, 8, 8, 4, 3, 4, 7, 5, 5, 1, 3, 7, 5, 1, 8, + 4, 4, 2, 7, 5, 3, 1, 5, 8, 7, 3, 3, 6, 1, 1, 7, 1, 3, 8, 7, 1, 2, 4, 3, 5, 2, 2, 5, 1, + 6, 8, 2, 4, 8, 8, 4, 4, 3, 1, 2, 6, 2, 1, 1, 8, 1, 8, 8, 1, 5, 4, 1, 8, 1, 1, 2, 7, 8, + 5, 6, 6, 5, 8, 5, 8, 1, 5, 5, 6, 5, 5, 3, 2, 3, 8, 4, 7, 5, 7, 4, 6, 5, 2, 7, 7, 8, 1, + 7, 2, 4, 6, 5, 1, 3, 1, 8, 1, 5, 2, 2, 6, 6, 6, 1, 4, 8, 4, 1, 3, 7, 1, 1, 1, 7, 4, 5, + 5, 6, 4, 5, 3, 5, 3, 5, 2, 7, 4, 3, 1, 4, 1, 7, 7, 6, 4, 3, 4, 2, 4, 2, 7, 3, 4, 1, 8, + 8, 6, 7, 2, 3, 2, 5, 6, 5, 6, 5, 1, 2, 1, 6, 2, 1, 4, 2, 2, 6, 6, 7, 1, 2, 6, 2, 4, 2, + 4, 1, 6, 7, 5, 5, 4, 5, 4, 4, 2, 4, 8, 6, 8, 1, 6, 3, 7, 7, 8, 4, 2, 8, 1, 2, 1, 7, 8, + 4, 7, 2, 8, 6, 8, 3, 4, 3, 8, 8, 7, 3, 2, 4, 4, 1, 4, 6, 4, 6, 6, 7, 7, 4, 5, 8, 3, 8, + 3, 6, 8, 8, 1, 1, 7, 1, 2, 2, 7, 8, 1, 6, 7, 6, 3, 8, 6, 5, 5, 2, 2, 8, 5, 1, 6, 5, 3, + 6, 4, 2, 8, 5, 3, 1, 3, 4, 4, 1, 5, 2, 4, 8, 3, 7, 4, 1, 4, 7, 8, 4, 1, 3, 8, 3, 7, 4, + 1, 1, 4, 3, 3, 2, 6, 6, 2, 8, 8, 6, 5, 4, 4, 6, 1, 8, 5, 5, 8, 3, 8, 1, 5, 6, 4, 1, 1, + 6, 3, 8, 8, 7, 1, 6, 5, 5, 7, 4, 8, 7, 2, 6, 6, 8, 4, 4, 7, 2, 1, 7, 3, 5, 8, 8, 6, 2, + 2, 5, 1, 3, 7, 7, 3, 4, 8, 5, 3, 7, 3, 3, 4, 2, 1, 4, 2, 6, 1, 1, 4, 7, 6, 8, 2, 3, 5, + 3, 2, 2, 7, 1, 2, 1, 4, 2, 4, 8, 5, 2, 3, 7, 2, 4, 3, 6, 3, 8, 5, 7, 3, 7, 5, 3, 4, 3, + 8, 7, 4, 4, 7, 3, 2, 1, 1, 1, 1, 3, 1, 6, 3, 6, 4, 3, 2, 1, 1, 1, 6, 5, 2, 2, 5, 5, 6, + 6, 1, 8, 7, 8, 7, 6, 2, 2, 3, 5, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, + ]; + let expected = false; + assert_case(given, expected); + } fn assert_case(given: Vec, expected: bool) { let actual = Solution::idiom_can_jump(&given);