1. 程式人生 > >80. Remove Duplicates from Sorted Array II(python+cpp)

80. Remove Duplicates from Sorted Array II(python+cpp)

題目:

Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twice 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,1,2,2,3],
Your function should return length = 5, with the first five elements of nums being 
1, 1, 2, 2 and 3 respectively.
It doesn't matter what you leave beyond the returned length. 

Example2:

Given nums = [0,0,1,1,1,1,2,3,3],
Your function should return length = 7, with the first seven elements of nums being modified to 0, 0, 1, 1, 2, 3 and 3 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 thefirst len elements. 
for (int i = 0; i < len; i++) {
    print(nums[i]); 
}

解釋: 本來以為是類似於82. Remove Duplicates from Sorted List II(python+cpp)的要求,結果發現不是的。 題目要求:給定一個排好序的陣列,in-place刪除一些重複元素使得最終返回的陣列多種每個陣列至多出現兩次。返回最終的陣列的長度。 其實這種題目也是需要用兩個指標的,先寫一個不那麼明顯的用指標的方法,速度比較慢。 pytho程式碼:

class Solution:
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        i=0
        for n in nums:
            if i<2 or n>nums[i-2]:
                nums[i]=n
                i+=1
        return i

c++程式碼:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        //j指向當前需要賦值的位置
        int j=0;
        for(int i=0;i<nums.size();i++)
        {
            if (i<2 || nums[j-2]<nums[i])
            {
                nums[j]=nums[i];
                j+=1;
            }
        }
        return j;
    }
};

用兩個指標的解法: python程式碼:

class Solution:
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n=len(nums)
        if n<=2:
            return n
        count,i,j=1,1,1
        while i< n:
            if nums[i]==nums[i-1]:
                if count<2:
                    count+=1
                    nums[j]=nums[i]
                    j+=1
                i+=1
            else:
                count=1
                nums[j]=nums[i]
                i+=1
                j+=1
        return j     

c++程式碼:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n=nums.size();
        if(n<=2)
            return n;
        int count=1,i=1,j=1;
        while(i<n)
        {
            if(nums[i]==nums[i-1])
            {
                if (count<2)
                {
                    count++;
                    nums[j]=nums[i];
                    j++;
                }
            }
            else
            {
                count=1;
                nums[j]=nums[i];
                j++; 
            }
            i++;
        }
        return j;
    }
};

總結: 注意變數的初始化和一些特殊情況的判斷。