题目的暴力解法很简单,遍历过程中记录哪一段是重复的,然后将那一段同值元素替换为只有一个元素即可。这个暴力解法的时间复杂度是O(n^2)的。
我按照自己的思路自己实现了代码如下(通过比较相邻元素)
1 class Solution { 2 public: 3 int removeDuplicates(vector<int> &nums) { 4 if (nums.size() < 2) return nums.size(); 5 int len = nums.size(); 6 int j = 0; 7 for (int i = 0; i < len-1; i++) { 8 if (nums[i] != nums[i + 1]) { 9 nums[j++]=nums[i]; 10 } 11 } 12 nums[j++]=nums[len-1]; 13 return j; 14 } 15 };
里面有三点细节需要考虑到的。
第一点,因为基于比较来移动指针。所以对于只含有一个元素或者没有元素的情况是首先要考虑的。
第二点,如果所有元素同值,那么指针也是没法移动的,也需要考虑。
第三点,对于每个元素和下一个元素这种比较方法,最后一个值的元素在for循环中没有识别,需要在循环后再次判断。
更好的解法被称作双指针法。这里的“指针”并非c语言上的指针。参考代码如下
1 class Solution { 2 public: 3 int removeDuplicates(vector<int>& nums) { 4 if (nums.size() < 2) return nums.size(); 5 int j = 0; 6 for (int i = 1; i < nums.size(); i++) 7 if (nums[j] != nums[i]) nums[++j] = nums[i]; 8 return ++j; 9 } 10 };
原文:https://www.cnblogs.com/dongjl/p/13526600.html