本文共 1297 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要删除一个非严格递增排列的数组中的重复元素,使得每个元素只出现一次,并保持原来的相对顺序。我们将使用双指针的方法来高效地完成这一任务。
我们可以使用双指针的方法来处理这个问题,因为数组是有序的(非严格递增排列)这样可以在 O(n) 的时间复杂度和 O(1) 的空间复杂度下来解决问题。具体步骤如下:
p
和 q
,分别指向数组的起始位置,p
始始为 0,q
为 1。q
指针逐步移动。当遇到不同元素时,将 q
指针的元素移动到 p
指针的下一个位置,然后 p
移动。q
移动多步,但 p
保持不变。q
遍历完整个数组后,返回 p + 1
,因为 p
最终指向的是最后一个被处理的元素。这种方法确保了元素的相对顺序保持不变,并且只需要一个遍历,时间复杂度为 O(n),空间复杂度为 O(n)。为了使代码更高效,我们可以直接在数组上修改元素位置。
public class DelRepeatParamOfArray { public static int removeDuplicates(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int p = 0, q = 1; while (q < nums.length) { if (nums[p] != nums[q]) { nums[p + 1] = nums[q]; p++; } q++; } return p + 1; } public static void main(String[] args) { int[] array = new int[]{1, 1, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 100, 100, 102, 102, 102, 104, 105, 119, 119, 200, 300, 400, 500}; System.out.println("删除后长度:" + removeDuplicates(array)); }}
移除重复元素:
p
和 q
,分别指向数组的第一个元素的位置。q
指针遇到与 p
指针当前元素不同的值时,将该值移动到 p+1
位置,并将 p
移动到下一个位置。q
指针移动到下一个位置,不改变 p
。返回结果:
p
指针位于数组中最后一个被处理元素的位置,返回 p + 1
即可得到了唯一元素的数量。这种方法利用了数组的已排序特性,高效地减少了重复元素,保持了原有的相对顺序,并且代码简洁高效。
转载地址:http://pagyk.baihongyu.com/