给你一个有序数组 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;
}
这与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走过了多少次再加一即得到了该数组中不同数字的个数了。
这道题中给出的方法返回的数组的长度其实是虚假的长度,整个算法并没有真的改变数组长度,只是改变了数组中部分元素的值而已。
例如可以通过修改打印函数将整个数组打印出来:
返回值是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