类似题目:
LeetCode27 移除元素 --数组--双指针--简单 (移除指定目标元素)
而本题是数组中相同的元素
解题思路:
需要原地删除,不需要大于O(1)的空间,那么如何不全部向前移动,而是前后的两个元素比较并覆盖?
双指针解法:
一个慢指针和一个快指针,i为慢指针,j为快指针,当nums[i]==nums[j],增加j跳过重复项
当nums[i]!=nums[j]时,需要i向后移动一位并将j位置的元素赋值给它,也即是将nums[j]赋值给nums[i+1].直到j到达数组末尾
//Java
class Solution {
public int removeDuplicates(int[] nums)
{
if (nums.length == 0) return 0;
int i = 0;
for (int j = 1; j < nums.length; j++)
{
if (nums[j] != nums[i])
{
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
}
//C++
class Solution {
public:
int removeDuplicates(vector<int>& nums)
{
if (nums.size() == 0) return 0;
int n = 0;
for(int i = 1; i < nums.size(); i++)
{
if(nums[i]!=nums[n])
{
n+=1;
nums[n]=nums[i];//前一个值更新为后一个值
}
}
return n+1;
}
};
算法复杂度分析
时间复杂度:O(n) 假设数组的长度是 nn,那么 ii 和 jj 分别最多遍历 nn 步
空间复杂度:O(1)