10多分钟的时间就把一道中等题目做出来了,而且我还没有思考,边写边想。我的思路很简单,就是按照题目意思,从前往后遍历数组并统计相同的个数count,然后一直维护一个左指针,把遍历的数移到左指针上然后左指针向右移动,然后根据count的个数分情况处理,如果count小于2就把nums[i]移动到left上,如果count>2不用做任何事情,如果不同count改为1并把nums[i]放入left,最后返回left即可。
class Solution {public int removeDuplicates(int[] nums) {int n = nums.length;int left =1;int count =1;for(int i=1;i<n;i++){if(nums[i]==nums[i-1]){count++;if(count<=2){nums[left++]=nums[i];}}else{count=1;nums[left++]=nums[i];}}return left;}
}
看了一下题解,题解的做法也差不多,他是没有去统计数字的个数,而是直接和上上个保存的元素相比,若相同则不能再保存,若不同则保存。
class Solution {public int removeDuplicates(int[] nums) {int n = nums.length;if (n <= 2) {return n;}int slow = 2, fast = 2;while (fast < n) {if (nums[slow - 2] != nums[fast]) {nums[slow] = nums[fast];++slow;}++fast;}return slow;}
}