這是練習編成雙指針最好的一道題,邏輯簡單,優化簡單。
簡單理解:采用雙指針,總左邊進行開始,如果有新元素則將前面移動到后面。然后加一個剪枝操作,如果前后元素大于1,再移動。
給你一個?非嚴格遞增排列?的數組?nums
?,請你?原地?刪除重復出現的元素,使每個元素?只出現一次?,返回刪除后數組的新長度。元素的?相對順序?應該保持?一致?。然后返回?nums
?中唯一元素的個數。
考慮?nums
?的唯一元素的數量為?k
?,你需要做以下事情確保你的題解可以被通過:
- 更改數組?
nums
?,使?nums
?的前?k
?個元素包含唯一元素,并按照它們最初在?nums
?中出現的順序排列。nums
?的其余元素與?nums
?的大小不重要。 - 返回?
k
?。
代碼如下:
class Solution {public int removeDuplicates(int[] nums) {if(nums == null || nums.length == 0) return 0;int p = 0;int q = 1;while(q < nums.length){if(nums[p] != nums[q]){if(q - p > 1){ // 剪枝nums[p + 1] = nums[q];}p++;}q++;}return p + 1;}public static void main(String[] args) {System.out.println(new Solution().removeDuplicates(new int[]{1, 2,2,2,2,3,5,9}));}
}