1.題目描述:
給定一個排序數(shù)組钝诚,你需要在原地刪除重復(fù)出現(xiàn)的元素隘截,使得每個元素只出現(xiàn)一次铲咨,返回移除后數(shù)組的新長度。
不要使用額外的數(shù)組空間蒜鸡,你必須在原地修改輸入數(shù)組并在使用 O(1) 額外空間的條件下完成胯努。
鏈接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
2.題解思路:
注意到數(shù)組是有序的牢裳,所以重復(fù)的元素一定是相鄰的。
題目要求在原地刪除重復(fù)出現(xiàn)的元素叶沛,其實就是將后邊不重復(fù)的元素移動到前邊蒲讯,替代那些重復(fù)的元素。
也就是說恬汁,遇到重復(fù)元素不做處理伶椿,遇到不重復(fù)元素才往前覆蓋。
可以考慮使用雙指針法(快慢指針)氓侧〖沽恚快指針從第二個元素開始(下標(biāo)1)遍歷數(shù)組中所有的元素,慢指針指向最后一個不重復(fù)的元素(初始為下標(biāo)0)约巷。
當(dāng)快指針j指向的值和慢指針i指向的值相等時偎痛,說明快指針指向的是重復(fù)元素,所以慢指針不動(因為下一個就是重復(fù)元素了独郎,而慢指針指向的是不重復(fù)元素)踩麦,快指針自增。
當(dāng)快指針j指向的值和慢指針i指向的值不相等時氓癌,說明快指針指向的是不重復(fù)元素谓谦,需要將這個不重復(fù)元素覆蓋到第一個重復(fù)元素的位置(也就是慢指針的下一個位置),再將快指針自增贪婉。
3.代碼實現(xiàn):
public int removeDuplicates(int[] nums) {
if (nums.length == 0) {
return 0;
}
int i = 0;
for (int j = 1; j < nums.length; j++) {
if (nums[i] != nums[j]) {
nums[++i] = nums[j];
}
}
return i + 1;
}
復(fù)雜度分析:
- 時間復(fù)雜度:O(n)反粥,假設(shè)數(shù)組的長度是n,需要遍歷n步疲迂。
- 空間復(fù)雜度:O(1)才顿,不需要額外開辟新的空間。