26.删除排序数组中的重复项
题目链接:
题目思路:
首先要理解题目意思,这里返回的是删除后的数组长度,但是判题机器是以 前 删除的长度 的 数组进行判断 判题标准:
系统会用下面的代码来测试你的题解:
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;
}
};