2023/3/7 每日刷题第四天
针对本题,首先我们上来先是无脑使用暴力算法,即不断反复将后面的元素前置覆盖,时间复杂度为O(n^2),很不幸结果显示是超时。
**代码:**
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int num=nums.size();
int dd=0;
if(num==1)
return num;
for(int i=1;i<num;i++)
{
if(nums[i-1]==nums[i])
{
for(int j=i;j<num;j++)
nums[j-1]=nums[j];
num--;
i--;
dd++;
}
}
return num;
}
};
由于是时间上的错误,那么我们可以使用双指针刷法来降低时间复杂度,使得O(n^2)降低为O(n)级别,具体的思想就是用慢指针计算没有重复数据的个数,同时,以此更新数组
代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
//双指针
int num=1;
if(nums.size()==1)
return nums.size();
for(int i=1;i<nums.size();i++)
{
if(nums[i]!=nums[i-1]) // 前后数字是相等的
{
nums[num++]=nums[i];
}
}
return num;
}
};