题目:删除排序数组中的重复项
描述:一个有序数组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; } }
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...