力扣刷题笔记-删除数组重复元素

61 天前
 NullPointerExce

纠结要不要离开杭州

删除数组中的重复元素

思想

双指针/快慢指针

  1. 只有当两个元素不相等的时候才发生复制和 p 指针向后移动
  2. 如果两个指针指向的元素相等,则 q 指针向后移动
  3. p 和 q 不相邻的情况下才发生复制和替换,如果相邻,只是简单的 q 指针向后移动

p 指针是慢指针,q 指针是快指针,当 p 和 q 指向的元素相同的时候,q 指针继续向后移动,直到元素不相等,然后将 q 指针指向的元素复制给 p 的下一个元素(之所以是下一个,q 一直在向后移动,注意向后移动的前提是元素相同,那么就是覆盖掉相同的元素),同时 p 指针向后移动一个位置。

关键点

p 和 q 之间应该隔一个元素,

循环

便利数组,用 while 循环

code

class Solution {
    public int removeDuplicates(int[] nums) {
        int p = 0;
        int q = 1;
        while(q < nums.length){
            if(nums[p] != nums[q]){
                if((q-p) > 1){
                    nums[p+1] = nums[q];
                }
                p++;
            }
            q++;
        }
        return p+1;
    }
}

p+1

p 是从 0 开始的,所以要返回 p+1 才是新数组的长度

1685 次点击
所在节点    程序员
9 条回复
horizon
61 天前
「纠结要不要离开杭州」
啥意思
biutcoder
61 天前
@horizon 当日心情
jackwaycn
61 天前
得 v2 成笔记站了
JiangNanLong
61 天前
public int removeDuplicates(int[] nums) {
int p = 0;
int q = 1;
while(q < nums.length){
if(nums[p] != nums[q]){
nums[++p]=nums[q];
}
q++;
}
return p+1;
}
这么写就行吧,不需要判断 q-p>1 吧
piecezzz
61 天前
都是套路,没有啥技巧。不过对提升 coding 能力和面试确实有用
NullPointerExce
61 天前
@JiangNanLong 判断这一行的目的是,如果一个数组是[1,2,3,4,5,6],本来不需要做任何操作,但是如果不判断 q-p>1 ,就要做一遍无用功。
NullPointerExce
61 天前
@biutcoder 正解
NullPointerExce
61 天前
@piecezzz 如果不是为了面试,多刷一会儿抖音不香吗
yoyolichen
61 天前
忘了加"有序"

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1057916

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX