因為python的list可以直接del list[index],因此直接使用了暴力方法,判斷是否重複了兩次,是的話直接使用del。
在轉向使用j**a時,因為暴力方法的侷限,一直在找怎樣對j**a的array進行具體索引的元素刪除,但是發現array初始化之後長度並不能進行修改,只能new乙個array進行複製,不符合題目原地的要求,轉去看題解。
根據題解提示後,採用快慢雙指針對原陣列進行遍歷:
slow:代表將要返回的陣列的後邊界(修改後的陣列到nums[slow - 1])
fast: 代表當前遍歷到的數字
這題能這麼做,是因為原陣列是公升序,保證了修改後的陣列nums[:slow]中一定也是公升序。對於當前遍歷到的元素,存在著以下的約束關係:
nums[slow - 2] <= nums[slow - 1] <= nums[fast]
因此要判斷當前元素nums[fast]是否重複了兩次,只需要進行 nums[slow - 2] ?= nums[fast] 的比較:
if nums[slow - 2] == nums[fast] —— 只要等式成立,那麼一定有:
nums[slow - 2] == nums[slow - 1] == nums[fast]
說明當前元素重複了兩次,fast可直接跳過:
fast += 1
else nums[slow - 2] != nums[fast] —— 要是等式不成立,說明至多只有 nums[slow - 1] == nums[fast] 成立,即只有一次重複,還需將元素新增到陣列中,陣列長度也需+1:
nums[slow] = nums[fast]
slow += 1
fast += 1
最後返回slow即可。(slow代表了最後陣列的長度,修改後的陣列是 nums[ : slow])
刪除排序陣列中的重複項
題目描述 給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。示例 給定陣列 nums 1,1,2 函式應該返回新的長度2,並且原陣列 nums 的前兩個元素被修改為...
刪除排序陣列中的重複項
給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。示例 1 給定陣列 nums 1,1,2 函式應該返回新的長度 2,並且原陣列 nums 的前兩個元素被修改為 1...
刪除排序陣列中的重複項
給定陣列 nums 1,1,2,2 函式應該返回新的長度 2,並且原陣列 nums 的前兩個元素被修改為 1,2。你不需要考慮陣列中超出新長度後面的元素。給定 nums 0,0,1,1,1,2,2,3,3,4 函式應該返回新的長度 5,並且原陣列 nums 的前五個元素被修改為 0,1,2,3,4。...