leedcode第26題刪除排序陣列中的重複項——基於c++
阿新 • • 發佈:2018-12-12
RemoveDuplicates::clearDuplicates(vector<int>& nums) { /**方法一:暴力法 * 從前往後遍歷行不通,考慮從後往前遍歷,遇到重複項可以直接length - 1並捨棄。 * 0 0 1 1 1 2 2 2 length = 8 * 0 0 1 1 1 2 2 length - 1 = 7 && num[7] = num[8] * 0 0 1 1 1 2 length - 1 = 6 && num[6] = num[7] * 0 0 1 1 1 2 不做處理 * 0 0 1 1 2 length - 1 = 5 && num[5] = num[6] * 0 0 1 2 length - 1 = 4 && num[4] = num[5] * 0 0 1 2 不做處理 * 0 1 2 length - 1 = 3 && num[3] = num[4] && num[2] = num[3] */ int length = nums.size(); if(nums.size() == 0) return 0; for(int i = nums.size() - 1; i > 0; i--) { if(nums[i] == nums[i - 1]) { length--; for(int j = i - 1; j < nums.size(); j++) { nums[j] = nums[j + 1]; } } } return length; } RemoveDuplicates::easy_clearDuplicates(vector<int>& nums) { /** * 簡單法:暴力法容易想到,但是隻能擊敗4%的玩家,每次遇到重複項,其後所有的元素都要移動。 * 採用快指標與慢指標結合的方法: * 快指標:可以跳過重複元素項,慢指標一點點的移動 * 這種方法擊敗了全國40%的玩家。 * 0 1 1 1 1 1 2 2 */ int length = 1; int j = 1; //快指標 int i = 0; //慢指標 while(j != nums.size()) //快指標從第二個元素開始,遍歷後面所有元素。 { if(nums[j] == nums[i]) //若快指標當前指向元素與慢指標指向的元素相同 { j++; //保持慢指標的位置,快指標++ }else //若快指標當前指向元素與慢指標指向的元素不同 { i++; //慢指標向後挪一位 nums[i] = nums[j]; //慢指標當前元素等於快指標當前元素 j++; //快指標++ } } return i + 1;