題目描述
給定一個排序數(shù)組,你需要在原地刪除重復(fù)出現(xiàn)的元素,使得每個元素只出現(xiàn)一次,返回移除后數(shù)組的新長度。
不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組并在使用 O(1) 額外空間的條件下完成。
給定數(shù)組 nums = [1,1,2],
函數(shù)應(yīng)該返回新的長度 2, 并且原數(shù)組 nums 的前兩個元素被修改為 1, 2。
解題思路
采用雙指針方式處理。
- 初始指針 i, j 位置為 0
- 指針 j 先向右移動
- 比較指針 i,j 元素是否相同,若指針i,j元素相同則指針 j 繼續(xù)向右移動;反之將指針 j 元素復(fù)制到指針 i + 1 處元素
- 當(dāng)指針 j 移動到數(shù)組末尾時則停止
其流程如下圖所示:
image
實現(xiàn)
public static int solution (int[] nums) {
int i = 0, j = 0;
while (true) {
// 指針 j 向右移動
j++;
// 指針 j 移動到數(shù)組末尾則退出,說明數(shù)組元素都判斷了去重
if (j >= nums.length) {
break;
}
if (nums[j] == nums[i]) {
// 指針 i, j 元素相同,說明重復(fù)元素;
// 指針 j 繼續(xù)向右移動
continue;
} else {
// 指針 i, j 元素不相同;則將指針 j 元素復(fù)制到 指針 i 后一位,這樣就保證指針 i 后元素不重復(fù)
nums[i + 1] = nums[j];
// 指針 i 向右移動,繼續(xù)處理
i++;
}
}
return i + 1;
}