給你一個有序數組 nums ,請你 原地 刪除重復出現的元素,使每個元素 只出現一次 ,返回刪除后數組的新長度。
不要使用額外的數組空間,你必須在 原地 修改輸入數組 并在使用 O(1) 額外空間的條件下完成。
我沒注意到“有序”這一條件,這一寫法也適用于無序的(最后的倔強)
思路:fast用于尋找不重復的元素,slow存儲已經篩選過的元素。將每個元素與已經重排的元素比較,如果沒有,就添加進去;如果有,就跳過。不是和nums后面的比較,這點我第一次就搞反了
class Solution {public int removeDuplicates(int[] nums) {int slow = 0;for(int fast = 1;fast<nums.length;fast++){//從第二個元素向前比較,所以fast取1不取0for(int j = 0;j<slow+1;j++){//遍歷已經重排的部分,也就是nums[]前面的部分if(nums[fast]==nums[j]){break;//出現重復說明前面部分已經有這個元素了}if(j==slow){//遍歷結束判斷,說明前面部分沒有這個元素nums[++slow] = nums[fast];//把這個元素加進去}}}return (slow+1);//slow是最大下標,不是元素個數}
}
雙指針“slow”“fast”真好用啊