题目:删除排序数组中的重复项
描述:一个有序数组nums,原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。
要求:不能使用额外的数组空间,必须在原地修改输入数组并在使用O(1) 额外空间的条件下完成。
例如:输入:[0,1,2,2,3,3,4],输出:5
双指针算法:
数组完成排序后,我们可以放置两个指针 i 和 j,其中 i 是慢指针,而 j 是快指针。只要nums[i]=nums[j],我们就增加 j 以跳过重复项。当遇到 nums[j] != nums[i]时,跳过重复项的运行已经结束,必须把nums[j])的值复制到 nums[i +1]。然后递增 i,接着将再次重复相同的过程,直到 j 到达数组的末尾为止。
package od;
/**
* 删除排序数组中的重复项
* 描述:一个有序数组nums,原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。
* 重点考察:双指针算法
* 原文地址:https://www.codernav.com/2788.html
*/
public class Odtest08 {
public static void main(String[] args) {
int[] arr = {0, 1, 2, 2, 3, 3, 4};
System.out.println(f(arr));
}
private static int f(int[] arr) {
if (arr.length < 1) {
return 0;
}
// i慢指针,j快指针
int i = 0;
// 第一次遍历:i=0,j=1 -> 0,1,2,2,3,3,4 i=1
// 第二次遍历:i=1,j=2 -> 0,1,2,2,3,3,4 i=2
// 第三次遍历:i=2,j=3 -> 0,1,2,2,3,3,4 i=2
// 第四次遍历:i=2,j=4 -> 0,1,2,3,3,3,4 i=3
// 第五次遍历:i=3,j=5 -> 0,1,2,3,3,3,4 i=3
// 第六次遍历:i=3,j=6 -> 0,1,2,3,4,3,4 i=4
for (int j = 1; j < arr.length; j++) {
if (arr[i] != arr[j]) {
i++;
arr[i] = arr[j];
}
}
return i + 1;
}
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...

