刪除排序陣列中的重複項(Remove-Duplicates-From-Sorted-Array)
題幹如下:
給定一個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。
不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 O(1) 額外空間的條件下完成。
示例 1:
給定陣列 nums = [1,1,2],
函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為 1, 2。 你不需要考慮陣列中超出新長度後面的元素。
示例 2:
給定 nums = [0,0,1,1,1,2,2,3,3,4],
函式應該返回新的長度 5, 並且原陣列 nums 的前五個元素被修改為 0, 1, 2, 3, 4。你不需要考慮陣列中超出新長度後面的元素。
來源:力扣
這個題目有兩個注意點:
- 源陣列是有序的,並且是從小到大的
- 解題的過程中不能引入新的陣列
解題思路
其實刷的題多了之後,碰到 陣列 或者 字串 型別的題目,第一反應就是 雙指標思路,這題的解題思路主要應用的也是 雙指標。
首先初始化 i 指向第一個元素, j 指向第二個元素。接著比較 arr[i] 與 arr[j] 的大小:當 arr[i] 與 arr[j] 相等時,i 不動,j 向後移動一位;當 arr[i] 與 arr[j] 不等時,將 arr[i+1] 與 arr[j] 互換,之後 i++,j++。以此類推,直到 j 越界。
流程圖如下:
程式碼實現
GO實現
// nums是有序的,並且是從小到大的
func removeDuplicates(nums []int) int {
if len(nums) <= 0 {
return 0
}
i := 0
j := 1
for j <= len(nums) -1 {
// 相等,則 j++
if nums[j] == nums[i] {
j++
} else {
// 不想等,則 i+1 與 j 指向的元素互換,i 向後移動一位,j 向後移動一位
i++
nums[i], nums[j] = nums[j], nums[i]
j++
}
}
// 返回長度
return i + 1
}
總結
每天進步一點點,加油!
演算法教程專案,每天更新一題,點個 star 支援一下呀:
https://github.com/wx-satellite/learning-a...
本作品採用《CC 協議》,轉載必須註明作者和本文連結