leetcode C++题解系列-025 删除排序数组中的重复项

leetcode C++题解系列-025 删除排序数组中的重复项

编码文章call10242025-04-25 11:13:1116A+A-

题目


解题代码与测试

//
// Created by tannzh on 2020/6/26.
//

/*
 * 删除排序数组中的重复项
 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。

示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
 
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}
 */
#include <iostream>
#include <vector>

using std::vector;

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        auto n = nums.size();
        if (n < 2) return n;
        int size = 1;
        for (int i = 1; i != n; ++i)
            if (nums[i-1] != nums[i])
                nums[size++] = nums[i];
        return size;
    }
};

int main(int argc, char **argv)
{
    Solution s;
    std::vector<int> nums1 = {1,1,2};
    std::vector<int> nums2 = {0,0,1,1,1,2,2,3,3,4};

    std::cout << "nums1 = " << s.removeDuplicates(nums1) << std::endl;
    std::cout << "nums2 = " << s.removeDuplicates(nums2) << std::endl;

    return 0;
}

解题思路分析

这道题目比较简单,基本上看代码都能明白了,主要运用赋值法,即设置两个游标,一个指向数组的长度,一个遍历整个数组,然后遇到不重复项,则将数组长度指向的位置赋值为该不重复项,然后长度加一。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4