leetcode-rust/array/2_fase_slwo_pointer_27/src/main.rs

52 lines
1.7 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 解題影片 https://www.youtube.com/watch?v=98uu0FYPiU8&list=PL-qDGN2q6cbClYCRpJ2pyrlhYK9VjZmL3&index=2
// leetcode https://leetcode.com/problems/remove-element/
fn main() {
// 可變陣列要這樣用 rust
let mut case_a: Vec<i32> = vec![3, 2, 2, 3];
// 傳入時也要帖別聲明 &mut -> &mut case_a
let result = remove_element(&mut case_a, 3);
println!("Result: {}", result);
}
// 移除元素,返回刪除後陣列長度,快慢指針,這樣做不需要移動將後面連續的空間每一個都移動 O(n) 解法
// 1. 先想停止條件
// 2. 想邊界值
pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 {
let mut slow_pointer: usize = 0; // -> vec 長度從零開始
let mut fast_pointer: usize = 0;
let stop = nums.len();
// 先想停止條件
while fast_pointer < stop {
if nums[fast_pointer] != val {
// 更新陣列中資料
nums[slow_pointer] = nums[fast_pointer];
slow_pointer = slow_pointer + 1;
}
fast_pointer = fast_pointer + 1;
}
return slow_pointer as i32;
}
// 口 口 口 口
// 3,2,2,3
// val = 3
// ===============
// f = 0 -> 第一個是我們不要的,所以慢指針不移動,數組不更新,快指針繼續移動
// 3 口 口 口
// s
// ===============
// f = 1 -> 是我們要的1. 更新慢指針的位置元素為目前走訪到的元素 2. 更新慢指針位置,表示我們陣列已經更新到哪裡了,
// 3 2 口 口 ---> 2 2 口 口
// s ---> s
// ===============
// f = 2 -> 重複步驟
// 2 2 口 口 ---> 2 2 2 口
// s ---> s
// ===============
// f = 2 -> 重複步驟
// 2 2 2 3 ---> 2 2 2 3
// s ---> s