7--26. 删除有序数组中的重复项

发布时间 2023-11-09 21:51:33作者: 翻斗花园小美Q

第一次提交,两个测试用例都通过了,最后提交结果显示为【超出时间限制】,不通过的测试用例为 nums = [1,1]

于是,改

加了 if 判断语句

但还是提交结果显示【超出时间限制】,不通过的测试用例为 nums = [1,2,2]

卒!!!!!!

class Solution {
    public int removeDuplicates(int[] nums) {
        int k = 0;
        int ans = 1;
        for (int i = 0; i < nums.length - 1;  i = k) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] != nums[i]) {
                    nums[ans] = nums[j];
                    ans++;
                    k = j;
                    break;
                }
                //改:缺少一个逻辑:当输入的数组为nums = [1,1]时,会进入死循环,因为 k 的值不更新,一直为 0
                //所以 i 一直为0, j 一直为 1;所以会超出时间限制
                //加入以下判断
                // if (k == 0) {

                // }

            }
            //if判断语句应该放在第二层循环外面
            if (k == 0) {
                return ans;
            }
        }
        return ans;
    }
}

遂,

看题解

【某位同学的思路】

做了蛮久,题解也看了很久才弄明白。这里记录一下我的通俗的理解。 其实可以看作一个喜新厌旧的人的一个排队列过程。这个人比较喜新厌旧,看到没有见过的数字,就把它按顺序从左到右排好,如果是已经见过的数字就直接忽略掉。 比如0 4 4 7 7 7 9 第一个数字保持不动。 然后往后面看看到第一个4,没见过,是第一次看到4,于是把它排到0的后面。 再往后看,又看到一个数字4,老面孔直接忽略掉。 再往后看看到一个数字7,是新面孔。于是把她拉到最左边,放在紧跟着0 4的位置。 再往后看是7,直接忽略,接着又是7,直接忽略。 直到看到新的数字9,然后把然后把放到0 4 7的后面。 可以理解为左边是所有的新面孔的队列,而快指针就是评审官,负责找到新面孔。

这么理解的话去看很多人的代码和解释,我觉得会更容易理解一些。

【但我看了之后有个疑问:它怎么辨别是不是新面孔】

【看了一个前排的题解之后,疑问得到回答】:先放过程

 在这个题解中 用 p 指针及前面的元素都是出现过的,用 q 指针去探寻 q 后面的元素是不是新面孔,因为题目中说了,数组是 非严格递增排序的数组,既有序数组

【我用了三个指针!!!都没完美解决这道题!!! 没事儿~再接再厉嘛~这才刚开始捏,梅花香自苦寒来!】

插入别人的代码:

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

作者:Max
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。