解题思路:当我拿到题目的时候,还想让vector 变成对应的无重复数据,然后看到后面返回的长度后,我就知道题目为啥是简单的题目了,首先是有序,那我们设置要放入的数据,与游走数组的数据比较不就好了,相同向后移动,直到遍历整个数组,其实也就是双指针法了。时间复杂度0(N),空间复杂度0(1)。
老规矩,我从最简单的想法开始。
先上我们是图:
首先我们要判断这个数组的长度,要是长度为0的话就,返回0,要是长度为1的话就返回1,同时定义i 为0
int removeDuplicates(vector<int>& nums) { if (nums.size()<1) { return 0; } if (nums.size() == 1) { return 1; } int i = 0; ...... }如上图,如果我们设置j = 1. i 与 j发现数组数据一样,我们是不是移动 j 值。
当我们发现数据不一样了,我们是不是应该把下标2的数据写到1里面去,所以i++,移动到下标 1的位置 ,并且把j的数组数据放到下标为1的数组中了。
然后 j 与 i 数组数据有一样了,j往下走,一直走到与 i下标数组不同是数据。
以此类推我们可以把这个循环写出来;
for (int j = 1;j < nums.size();j++) { if (nums[i] != nums[j]) { i++; nums[i] = nums[j]; } }最终我们图为:
这个时候我们前5个数据就是不是重复的数据了。i 对应下标是 4 返回给数量就是 i+1了:
return i + 1;全部的代码:
int removeDuplicates(vector<int>& nums) { if (nums.size()<1) { return 0; } if (nums.size() == 1) { return 1; } int i = 0; for (int j = 1;j < nums.size();j++) { if (nums[i] != nums[j]) { i++; nums[i] = nums[j]; } } return i + 1; } void testremoveDuplicates() { vector<int> nums = {0,0,1,1,1,2,2,3,4}; int length = removeDuplicates(nums); for (int i = 0; i < length; i++) { cout << nums[i] << " "; } cout << endl; }测试结果: