0407_删除数组重复项
Algorithm:删除数组重复项¶
题目描述¶
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例¶
题目解析¶
利用 双指针 的思想
- 慢指针从下标0开始,快指针从下标1开始,比较慢快指针的数值大小;
- 若两指针的数值相同,则快指针向前移动一步,慢指针不变;
- 若两指针的数值不同,则慢指针向前一步,并将快指针的值赋值给慢指针,快指针向前移动一步;
- 直到快指针遍历完整个数组,返回慢指针的下标+1即可。
java代码¶
/**
* @param nums 输入的数组
* @return
*/
public int removeDuplicates(int[] nums) {
if (nums == null) { return 0; }
if (nums.length <= 1) { // 当nums长度小于1时,直接返回
return nums.length;
}
int slowIndex = 0;
for (int fastIndex = 1; fastIndex < nums.length; fastIndex ++) {
if (nums[slowIndex] != nums[fastIndex]) {
slowIndex++;
nums[slowIndex] = nums[fastIndex];
}
}
return slowIndex+1; // 返回值需要慢指针加1
}
/**
* 使用while 循环
* @param nums 输入的数组
* @return
*/
public int removeDuplicates(int[] nums) {
if (nums == null) { return 0; }
if (nums.length <= 1) { // 当nums长度小于1时,直接返回
return nums.length;
}
int slowIndex = 0;
int fastIndex = 1;
while(fastIndex != nums.length){
if (nums[fastIndex] == nums[slowIndex]) {
fastIndex++;
} else {
slowIndex++;
nums[slowIndex]=nums[fastIndex];
fastIndex++;
}
}
return slowIndex+1; // 返回值需要慢指针加1
}