leetcode_刪除有序陣列中的重複項
阿新 • • 發佈:2021-10-24
最近要刷leetcode了,所以寫在這裡。
一、題目要求
二、解題思路
我最開始的想法很簡單,就是從前往後遍歷,然後找到不一樣的值,把重複的值刪除
程式碼如下:(C++)
1 class Solution { 2 public: 3 int removeDuplicates(vector<int>& nums) { 4 int present_data=0; 5 int after_data=0; 6 int length = nums.size(); 7 int result_number = 0; 8 for(int i=0; i<length-1; i++) 9 { 10 present_data = nums[i]; 11 result_number = i; 12 //檢驗present_data後面的資料,是否與其相等 13 for(int j=i+1; j<length; j++) 14 { 15 after_data = nums[j]; 16 if(after_data==present_data)17 { 18 //如果相等則記錄位置 19 result_number = j; 20 } 21 //不相等則跳出 22 else 23 break; 24 } 25 result_number +=1; 26 //如果存在重複值,刪除掉區間[i+1, result_number) 27 if(result_number-i>1) 28 { 29 nums.erase(nums.begin()+i+1,nums.begin()+result_number); 30 length = nums.size(); 31 } 32 } 33 return nums.size(); 34 } 35 };
三、提升改進
雖然演算法通過了驗證,但是效果並不好。
後來我看了別人的方法,發現自己沒有理解程式的意思,被“刪除”誤導了,我以為刪除真的在記憶體裡面刪除,但是實際上它的刪除只是輸出陣列前length個變數,保證這些變數不重複就好了。
一個比較好的方法如下:
1 int removeDuplicates(vector<int>& nums) { 2 if (nums.size() < 2) return nums.size(); 3 int j = 0; 4 for (int i = 1; i < nums.size(); i++) 5 if (nums[j] != nums[i]) nums[++j] = nums[i]; 6 return ++j; 7 }View Code
這告訴我,要仔細理解題目意思,不用真正刪除其物理空間,其實也沒有必要。
縱一葦之所如,臨萬頃之茫然。