【LeetCode】80. Remove Duplicates from Sorted Array II (刪除排序陣列中的重複項 II)-C++實現及詳細圖解
阿新 • • 發佈:2019-01-28
問題描述:
(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;
}
參考資料: