Leetcode026-Remove Duplicates from Sorted Array

Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length.

Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.

Example 1:

Given nums = [1,1,2],

Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively.

It doesn't matter what you leave beyond the returned length.

Example 2:

Given nums = [0,0,1,1,1,2,2,3,3,4],

Your function should return length = 5, with the first five elements of nums being modified to 0, 1, 2, 3, and 4 respectively.

It doesn't matter what values are set beyond the returned length.

Clarification:

Confused why the returned value is an integer but your answer is an array?

Note that the input array is passed in by reference, which means modification to the input array will be known to the caller as well.

Internally you can think of this:

// nums is passed in by reference. (i.e., without making a copy)
int len = removeDuplicates(nums);

// any modification to nums in your function would be known by the caller.
// using the length returned by your function, it prints the first len elements.
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

Solution:
Vector在日常寫程序用的比較多,所以看一眼就有了點想法。
傳入的是vector的引用,需要在原數組上操作,vector已經排序了,比較索引爲ii+1的元素是否相同就可以,因爲美股元素只能出現一次,所以有兩種解決辦法,遇到相同的元素移到最後或者刪除,移到最後還要額外增加一個變量來計算不同元素的數量,所以直接用刪除的方式。
需要注意的就是vector的刪除問題,當刪除索引爲i的元素時,i後面的元素都會向前移動一位,要注意i++的索引的變化。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if (nums.size() == 0) {
            return 0;
        }
        for (int i = 0; i < nums.size() - 1; i++) {
            if (nums[i] == nums[i + 1]) {
                nums.erase(nums.begin() + i + 1);
                i--; //注意索引的變化
            }
        }  
        return nums.size();
    }
};
Time Submitted Status Runtime Memory Language
a few seconds ago Accepted 156 ms 9.9 MB cpp

大神的solution:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        nums.erase(std::unique(nums.begin(), nums.end()), nums.end());
        return nums.size();
    }
};
Time Submitted Status Runtime Memory Language
a few seconds ago Accepted 24 ms 9.8 MB cpp
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章