「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」
删除有序数组中的重复项
题目描述
给你一个有序数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改数组并在使用O(1)额外空间的条件下完成。
示例1:
输入:nums=[1,1,2]
输出:2,nums=[1,2]
解释:函数应该返回新的长度2,并且原数组nums的前两个元素被修改为1,2。不需要考虑数组中超出新长度后面的元素。
示例2:
输入:nums=[0,0,1,1,1,2,2,3,3,4]
输出:5,nums=[0,1,2,3,4]
解释:函数应该返回新的长度5,并且原数组nums的前五个元素被修改为0,1,2,3,4。不需要考虑数组中超出新长度后面的元素。
解析
双指针法
- 首先定义两个双指针fastIndex和slowIndex,它们都指向第一个元素。
- fastIndex指针依次从左向右遍历,slowIndex指向第一个数组元素
- 当出现两个数组元素的值不相等时,fastIndex指向的数组元素的值赋值给slowIndex,slowIndex指针向右移动一位。
- 当出现两个元素的值相等时,fastIndex指针继续向右遍历,slowIndex不动
- 最终当fastIndex遍历完所有的数组元素,有序数组中的重复项也被全部删除,此时slowIndex指针指向的数组元素下标就是最终数组的长度
注意题目中原地两个字,在计算机科学中,原地算法是一种使用小的,固定数量的额外之空间来转换资料的算法,这里就是指我们不要使用额外的数组空间
代码
class Solution {
public int removeDuplicates(int[] nums) {
//定义两个指针fastIndex,slowIndex
int fastIndex=1;
//这里的slowIndex需要定义,可以不用赋值,方便后面能够返回值
int slowIndex;
//两个指针初始化都指向第一个数组元素,fastIndex依次从左往右遍历
for(slowIndex=1;fastIndex<nums.length;fastIndex++){
//当fastIndex遍历时,两个数组元素不相等时
if(nums[fastIndex]!=nums[fastIndex-1]){
//fastIndex指向的数组元素的值赋给nums[slowIndex]
nums[slowIndex]=nums[fastIndex];
//slowIndex指针向右移动一位
slowIndex++;
}
}
//此时slowIndex指向的数组元素下表就是最终数组的长度
return slowIndex;
}
}