在最初開始刷題時,很多和陣列相關的題目讀完當下第一直覺便是使用雙層迴圈或是把符合條件的資料放進新的空陣列去解題,暴力、直覺、簡單。但隨著題目增加難度,發現有些題目會要求需要"原地(in-place)"處理陣列並達成題目要求回傳的結果。
一開始沒仔細詳讀題目,只知道一股腦的解題然後測試結果,卻沒明白題目要求的"in-place"是什麼。
原地演算法(in-place algorithm)
原地演算法(in-place algorithm)就僅使用原來的資料結構進行排序,不使用額外的暫存空間處理資料。講白話就是不能另外使用別的空陣列去存放或處理資料,必須在原陣列中完成題目的要求。
這時候問題來了,要怎麼樣才能在 不使用雙層迴圈 且 不使用額外空間 的條件下,完成題目呢?
其中,雙指針(Two Pointer)是可以滿足以上條件並解題的技巧之一。
雙指針(Two Pointer)
雙指針顧名思義,就是在題物給的條件下,先定義出兩個指針,利用這兩個指針去完成題目的要求。
雙指針分為以下兩種:
1.左右指針: 大多使用於處理Array或String,雙指針的方向可以同方向、也可以反向移動。
2.快慢指針:大多使用於處理Linked list,兩指針移動速度不同,這個部分會在後面的文章中詳細描述使用情境。
使用雙指針除了在解題上可以達到上述要求外,主要是可以幫助我們將時間複雜度從O(n2)或是O(n3)縮減成O(n)。
大致了解雙指針,開始來做左右指針的題目吧!
Reference:
https://hackmd.io/@SupportCoding/Two_Pointers
https://medium.com/%E6%8A%80%E8%A1%93%E7%AD%86%E8%A8%98/%E6%BC%94%E7%AE%97%E6%B3%95%E7%AD%86%E8%A8%98%E7%B3%BB%E5%88%97-two-pointer-%E8%88%87sliding-window-8742f45f3f55