LeetCode刷題--刪除排序數組中的重複項(簡單)

題目描述

給定一個排序數組,你須要在原地刪除重複出現的元素,使得每一個元素只出現一次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組並在使用O(1)額外空間的條件下完成。html

示例 1

給定數組 nums = [1,1,2],算法

函數應該返回新的長度 2, 而且原數組 nums 的前兩個元素被修改成 1, 2。數組

你不須要考慮數組中超出新長度後面的元素。函數

示例 2

給定 nums = [0,0,1,1,1,2,2,3,3,4],spa

函數應該返回新的長度 5, 而且原數組 nums 的前五個元素被修改成 0, 1, 2, 3, 4。指針

你不須要考慮數組中超出新長度後面的元素。code

說明:

爲何返回數值是整數,但輸出的答案是數組呢?htm

請注意,輸入數組是以「 引用 」方式傳遞的,這意味着在函數裏修改輸入數組對於調用者是可見的。blog

你能夠想象內部操做以下:排序

// nums 是以「引用」方式傳遞的。也就是說,不對實參作任何拷貝
int len = removeDuplicates(nums); // 在函數裏修改輸入數組對於調用者是可見的。 // 根據你的函數返回的長度, 它會打印出數組中該長度範圍內的全部元素。
for (int i = 0; i < len; i++) {     print(nums[i]); }

 

方法一:雙指針法

思路

數組完成排序後,咱們能夠放置兩個指針 i 和 j ,其中 i 是慢指針,而 j 是快指針。只要nums[ i ] = nums[ j ] ,咱們就增長 j 以跳太重複項。

當咱們遇到nums[ j ] != num[ i ] 時,跳太重複項的運行已經結束,所以咱們必須把它( nums[ j ] )的值複製到nums[ i + 1 ]。而後遞增 i,接着咱們將再次重複相同的過程,直到 到達數組的末尾爲止。

 

題目要求兩件事:

  • 統計數組中不一樣數字數量 i ;
  • 修改數組前 i 個元素爲這些不一樣數字。

 

算法流程:

  • 第一個指針 i : 每遇到新的不一樣數字時,執行 i ++,i 指針有兩個做用:

    1. 記錄數組中不一樣數字的數量;

    2. 做爲修改數組元素的索引。

  • 第二個指針 i: 因爲數組已經完成排序,所以遍歷數組,每遇到 nums[ j ] != num[ i ]  ,就說明遇到了新的不一樣數字,記錄之;
  • 最終,返回 i + 1 便可。

 

代碼實現

class Solution { 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] ){ //指針後移一位
                i++; //修改數組,
                nums[i] = nums[j]; } } //i初始值爲0,因爲要求數組長度,故須要加1
        return i + 1; } }

 

 

算法圖解

 

相關文章
相關標籤/搜索