80. 刪除有序陣列中的重複項 II

知識點:陣列;排序;雙指標

題目描述

給你一個有序陣列 nums ,請你 原地 刪除重複出現的元素,使每個元素 最多出現兩次 ,返回刪除後陣列的新長度。

不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 O(1) 額外空間的條件下完成。

示例
  1. 輸入:nums = [1,1,1,2,2,3]
  2. 輸出:5, nums = [1,1,2,2,3]
  3. 解釋:函式應返回新長度 length = 5, 並且原陣列的前五個元素被修改為 1, 1, 2, 2, 3 不需要考慮陣列中超出新長度後面的元素。
  4. 輸入:nums = [0,0,1,1,1,1,2,3,3]
  5. 輸出:7, nums = [0,0,1,1,2,3,3]
  6. 解釋:函式應返回新長度 length = 7, 並且原陣列的前五個元素被修改為 0, 0, 1, 1, 2, 3, 3 不需要考慮陣列中超出新長度後面的元素。

解法一:雙指標

這道題目和26題唯一的區別就是這道題目要求是可以有兩個重複的,仍然用雙指標,一個從頭到尾遍歷,一個是指示當前需要的陣列的最後一個;因為可以有兩個重複的,所以比較當前最後一個的前一個,如果不一樣,那就可以新增(即使和最後一個一樣也沒事),如果一樣了,那就證明index-1、index、還有i都是一樣的,那就不新增,直接後移;

  1. class Solution {
  2. public int removeDuplicates(int[] nums) {
  3. int index = 1; //仍然指示結果陣列的最後一個;
  4. for(int i = 2; i < nums.length; i++){
  5. if(nums[i] != nums[index-1]){
  6. index++; //如果和index-1相等,那證明index-1、index、i都相等,因為是排序的,所以不能加入,直接後移;
  7. nums[index] = nums[i];
  8. }
  9. }
  10. return index+1;
  11. }
  12. }

相關題目

26. 刪除有序陣列中的重複項