leetcode : Remove Element
runtime 0 ms, beats 100% of cpp submissions
O(n) solution with explanation
tags: two pointer
🔗 link
📖 description
給定一個數值陣列 nums ,與需要刪除的數字 val ,實作 c++ 的 remove ,將數字擺到陣列後方並回傳剩下的元素。
🧠 solution
這題有個重點是我們可以修改原始陣列的順序,並且要求空間複雜度為 O(1) ,所以使用額外空間的直接方法沒有效,但其實可以換個想法,因為我們只需要把要刪掉的元素放到後面就好。
所以可以維護一個右指標,負責指向下一個被刪除的元素需要擺放的位置,再使用一個左指標指向當前看到的元素,此時有兩種可能
- case 1 : 左指標看到的不是 val
- 不用做事
- case 2 : 左指標看的的是 val
- 將數值與右指標的位置互換,且右指標往左走,直到當前位置不是 val
最後回傳 右指標+1 的位置就是還剩下多少元素了
ex. 要刪除 3 1. round 1 (swap) | | 3, 2, 2, 3 2. round 2 (左右指標接觸,結束) | | 2, 2, 3, 3
⏳ time complexity
遍歷一次陣列,時間複雜度 O(n)
總時間複雜度 O(n)
📝 code
1 | class Solution { |