1. 程式人生 > >【LeetCode】80. Remove Duplicates from Sorted Array II (刪除排序陣列中的重複項 II)-C++實現及詳細圖解

【LeetCode】80. Remove Duplicates from Sorted Array II (刪除排序陣列中的重複項 II)-C++實現及詳細圖解

問題描述:

(1)建立一個輔助函式,找出下一個不析相等元素的選表

private:
    int nextIndex(const vector<int>& nums, int index){
        for(int i = index ; i < nums.size() ; i ++)
            if(nums[i] != nums[index])
                return i;  //返回i:相等元素的個數
        return nums.size();
    }

 如圖陣列:

下一個不相等元素為2,所以函式返回3

(2) 設

        int i = 0; //被替換的元素的下標(重複的元素)
        int j = 0; //要替換的元素的下標(不重複的元素)

(3)第一輪while迴圈

while(j < nums.size())

則 int k = nextIndex(nums, j);

 int len = min( 2, k-j);

 for(int ii = 0 ; ii < len ; ii ++)
                nums[i+ii] = nums[j];

第一輪for迴圈:

ii++;

第二輪for迴圈:

(4)第二輪while迴圈 

i  = 2;

j = 3;

k = nextIndex(nums, 3) = 5'

len =min( 2, k-j) = 2;

執行for迴圈:

      for(int ii = 0 ; ii < len ; ii ++)
                nums[i+ii] = nums[j];

第一輪for迴圈:

第二輪for迴圈: 

(5)第三輪while迴圈  

i  = 4;

j =  5;

k = nextIndex(nums, 5) = 6

len =min( 2, 1) = 2;

執行for迴圈:

            for(int ii = 0 ; ii < len ; ii ++)
                nums[i+ii] = nums[j];

第一輪for迴圈:

第一輪for迴圈:

ii < len 不成立,迴圈結束

(6)最後,附上完整程式碼:

#include <iostream>
#include <vector>

using namespace std;

/// Ad-Hoc
/// Time Complexity: O(n)
/// Space Complexity: O(1)
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {

        int i = 0; //被替換的元素的下標(重複的元素)
        int j = 0; //要替換的元素的下標(不重複的元素)
        while(j < nums.size()){
            int k = nextIndex(nums, j); //找出下一個不相同元素的下標
            int len = min( 2, k-j); //允許重複的元素個數,最多不可以超過2個
            for(int ii = 0 ; ii < len ; ii ++)
                nums[i+ii] = nums[j];
            i += len; //跳到下一組元素
            j = k;//下一個不相同元素的下標
        }

        return i;
    }

private:
    int nextIndex(const vector<int>& nums, int index){
        for(int i = index ; i < nums.size() ; i ++)
            if(nums[i] != nums[index])
                return i;  //返回i:相等元素的個數
        return nums.size();
    }
};


int main() {

    vector<int> nums1 = {1, 1, 1, 2, 2, 3};
    cout << Solution().removeDuplicates(nums1) << endl;

    return 0;
}

參考資料: