leetCode80. 删除有序数组中的重复项 II
题目描述
/**
* 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,
* 返回删除后数组的新长度。
*
* 不要使用额外的数组空间,你必须在 原地 修改输入数组
* 并在使用 O(1) 额外空间的条件下完成。
*
*/
思路分析
- 删除数组中重复的元素,要求数组中最多只能有两个重复的元素,并且数组是有序的
- 题目还要求原地删除,因此不能开辟新的空间,必须充分利用原始数组,因此处理后的数组元素肯定少于等于原始数组元素大小
- 定义两个指针,一个指针用于遍历原始数组,另一个指针用于存储不重复的元素,存储的规则为不重复的元素不超过两个,因此在遍历原始数组时,始终用当前遍历到的元素和存储的元素的前边两个位置上的元素作比较,判断是否重复,如果重复,则继续遍历下一个,如果不重复则将当前元素移动到存储元素指针的位置
- 源码见下
源码及分析
/**
*
* @param nums 要删除重复元素的数组
* @return 返回处理后的结果
*/
public int removeDuplicates(int[] nums) {
int len = nums.length;
if (len <= 2){
return len;
}
//定义两个指针,fast用于遍历数组nums,slow为处理后的数组下标
int slow = 2, fast = 2;
//从第三个元素开始遍历
while (fast < len){
//因为题目要求最多重复两个元素,因此需要判断当前遍历到元素和前边第2个元素是否相等
if (nums[slow - 2] != nums[fast]){
//如果不相等说明没有重复则改变位置,否则不改变
nums[slow] = nums[fast];
slow++;
}
//开始下一次遍历
fast++;
}
return slow;
}