C++ 删除有序数组中的重复项

题目:

给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。

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

总感觉这道题目不是很严谨,可能是因为是简单题的缘故吧。

刚开始对数组不是很了解,特别的这个 O(1) 额外空间的条件下完成一脸懵逼。最后网上盗用了别人的代码实现的(狗头保命)

代码如下:

#include 
#include 
using namespace std;
class Solution {
public:
    int removeDuplicates(vector& nums) {
        if (nums.empty()) {
            return 0;
        }
        int index = 0;
        for (int j = 1; j < nums.size(); j++) {
            if (nums[index] != nums[j]) {
                index++;
                nums[index] = nums[j];
            }
        }
        std::cout << "返回删除数组重复项后数组的长度:" << '\n';
        std::cout << index + 1 << '\n';
        return index + 1;
    }
};
int main() {
    Solution S;
    vector nums = { 1,2,3,3,3,3,4,5 };
    int tem = S.removeDuplicates(nums);
    std::cout << "新数组:" << '\n';
    for (int i = 0; i < tem; i++) {
        std::cout << nums[i] << ' ';
    }
    return 0;
}

C++ 删除有序数组中的重复项_第1张图片
这与leetcode官网给的解题基本上是一样的。这道题想复杂了,题目要求返回数组长度,其实也就是一个整型值,问我们这个数组中有几个不一样的数字而已。

所以对于一个数组而言,我们可以通过类似于两个指针的形式求解。初始时,第一个指针指向数组的第一个数字,第二个指针指向数组的第二个数字。如果两个数字不同,则第一个指针与第二个指针分别前进一位。例如:

 nums = { 1,2,3,3,3,3,4,5 };

初始时指针P1=1,指针P2=2

两者不同,所以分别进一位,将P2指针的数赋值给P1:

P1=2,指针P2=3

两者不同,所以分别进一位,将P2指针的数赋值给P1:

P1=3,指针P2=3

这时两个指针的数字相同,则第一个指针不动,第二个指针进一位:

P1=3,指针P2=3

直到:

P1=3,指针P2=4

两者不同,所以分别进一位,将P2指针的数赋值给P1:

P1=4,指针P2=5

两者不同,所以分别进一位,将P2指针的数赋值给P1:

P1=5,指针P2=null

因为已经走完了,所以程序跳出循环。

最后记录一下指针1走过了多少次再加一即得到了该数组中不同数字的个数了。

注意:

这道题中给出的方法返回的数组的长度其实是虚假的长度,整个算法并没有真的改变数组长度,只是改变了数组中部分元素的值而已。

例如可以通过修改打印函数将整个数组打印出来:

C++ 删除有序数组中的重复项_第2张图片
返回值是5,但是数组长度仍然是8。与原来的数组相比只是其中三个数字的值被改变了而已。

思考:

如何在删除重复项的时候将整个数组的长度也一并缩短???

参考:

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-tudo/

https://www.cnblogs.com/shiheyuanfang/p/13430969.html

你可能感兴趣的:(C++,c++,c语言,开发语言)