1. 程式人生 > 其它 >leetcode_刪除有序陣列中的重複項

leetcode_刪除有序陣列中的重複項

最近要刷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

這告訴我,要仔細理解題目意思,不用真正刪除其物理空間,其實也沒有必要。

縱一葦之所如,臨萬頃之茫然。