讓我們一起啃演算法----刪除排序陣列中的重複項

三斤和他的喵發表於2020-04-18

刪除排序陣列中的重複項(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 協議》,轉載必須註明作者和本文連結

三斤

相關文章