1. 程式人生 > >Leetcode刷題記(8)——刪除排序數組中的重復項

Leetcode刷題記(8)——刪除排序數組中的重復項

blank 方法 思路 引用 num str targe 別人 ren

搬運工~

給定一個排序數組,你需要在原地刪除重復出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。

不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完成。

示例 1:

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

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

你不需要考慮數組中超出新長度後面的元素。
解題思路:題目中一再強調在原地刪除,也就是說不希望使用新的內存空間,在原數組上進行操作,很自然就要想到“引用”,因為引用不會對原數組進行拷貝,
而是直接在原來的元素上進行操作,只是原來元素的一個別名,顯然leetcode題目代碼中也是使用的引用。
     接下來我的腦回路想的是:嵌套循環,如果元素與後一個元素或前一個元素值相等,就使用循環把這個值往後移,這樣把相等的元素移到了後面,前面的元素都是不相等的;
這樣一波操作下來徹底亂了,最後返回時就編譯錯誤,又偷偷的去看了別人的解答:
     使用兩個“指針!!!”一個快指針,一個慢指針,慢指針就相當於指向不重復的元素,快指針就遍歷數組:
當快指針不等於慢指針指向的元素時,慢指針向前進,並將快指針的元素賦給慢指針指向的下標元素處,
最後返回慢指針+1即可。註意!!!先判斷數組是否為空,否則會報超時錯誤“runtime error: reference binding to null pointer of type ‘const value_type‘ (stl_vector.h)”
在這個方法裏使用的是引用,是在調用函數傳來的形參上直接進行操作,因此雖然該函數返回的是一個整數值,但是對於調用函數來說返回的是沒有重復項的數組!!!
但是!!!這個方法的前提是數組中的元素已經排好序,萬一是沒排好序的應該先進行排序,這裏又要惡補各種排序大法了!!!
知識點:引用;排序;

Leetcode刷題記(8)——刪除排序數組中的重復項