初级算法 数组 删除排序数组中的重复项

292 阅读1分钟

26.删除排序数组中的重复项

题目链接:

leetcode.cn/leetbook/re…

题目思路:

首先要理解题目意思,这里返回的是删除后的数组长度,但是判题机器是以 前 删除的长度 的 数组进行判断 判题标准:

系统会用下面的代码来测试你的题解:

int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案

int k = removeDuplicates(nums); // 调用

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}

如果所有断言都通过,那么您的题解将被 通过。

所以只能把不重复的数往前推 朴素写法是直接开辟一个新的空间不重复就往里塞,但是这样就学不到算法的思想 通过双指针(快慢指针)算法来解决 快指针每次和前一个进行比较,如果不相同就填充在慢指针位置上,慢指针移动一格等待下一个不相同的值再进行填充,最终返回慢指针的结果就是不重复数组的长度

java code:

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if (n <= 1) return n;
        int res = 1;
        for(int i = 1; i < n; i++){
            if (nums[i] != nums[i - 1]) {
                nums[res] = nums[i];
                res++;
            }
        }
        return res;
    }
}

c++ code:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if(n <= 1) return n;

        int res = 1;
        for(int i = 1; i < n; i++){
            if(nums[i] != nums[i - 1]){
                nums[res] = nums[i];
                res++;
            }
        }
        return res;
    }
};