給定一個排序數組,你須要在原地刪除重複出現的元素,使得每一個元素只出現一次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組並在使用O(1)額外空間的條件下完成。html
給定數組 nums = [1,1,2],算法
函數應該返回新的長度 2, 而且原數組 nums 的前兩個元素被修改成 1, 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,接着咱們將再次重複相同的過程,直到 j 到達數組的末尾爲止。
1. 記錄數組中不一樣數字的數量;
2. 做爲修改數組元素的索引。
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; } }