LeetCode 26:Remove Duplicates from sorted array
阿新 • • 發佈:2018-11-24
這一題總的來說很簡單,最容易想到的就是遍歷陣列,判斷是否和前一個數相同,相同的話就刪除,不刪除的話計數加1
class Solution { public: int removeDuplicates(vector<int>& nums) { if(nums.empty()) return 0; int tmp= nums[0]; int num=1; for(vector<int>::iterator it=nums.begin()+1;it!=nums.end();) { while(*it==tmp) { it=nums.erase(it); if(it==nums.end()) { break; } } if(it!=nums.end()) { tmp=*it; it++; num++; } } return num; } };
但是這種方式總是在陣列迴圈過程中修改陣列元素,總感覺不是很安全和高效,事實證明只能打敗46%答案。因此可以換一種思路,遍歷陣列,碰到一個新的數值就將它覆蓋頭指標的數值,頭指標加一,最後統一刪除頭指標後面的元素即可,結果可以打敗70%左右的答案。
class Solution { public: int removeDuplicates(vector<int>& nums) { if(nums.empty()) return 0; if(nums.size()==1) return 1; int i=0; for(int j=i+1;j<nums.size();j++) { if(nums[i]!=nums[j]) { nums[++i]=nums[j]; } } for(vector<int>::iterator it=nums.begin()+i+1;it!=nums.end();) { it=nums.erase(it); } return i+1; } };
這一題和27像,可以用同樣的方式解決:
方法如下:
class Solution { public: int removeElement(vector<int>& nums, int val) { int i=0; for(int j=0;j<nums.size();j++) { if(nums[j]!=val) { nums[i++]=nums[j]; } } for(vector<int>::iterator it=nums.begin()+i;it!=nums.end();) { it=nums.erase(it); } return nums.size(); } };
可以打敗98%的答案