https://leetcode.cn/problems/remove-element/
题目的意思就是说删除数组中和所给元素相同的元素,先不考虑别的要求,单独实现这个功能,应该怎么做
思路一:
遍历数组,一一匹对看是否有和所给元素相同,若相同,将后面元素向前移动将其覆盖,实现所谓删除.代码大致如下
int removeElement(int* nums, int numsSize, int val){
for(int i=0;i<numsSize;i++)
{
if(nums[i]==val)
{
for(int j=i;j<numsSize-1;j++)
{
nums[j]=nums[j+1];
}
}
}
return numsSize;
}
此处时间复杂度为O(N^2),空间复杂度为O(1)
思路二:
创建一个新数组,长度为numsSize,遍历原数组,将不等于所给元素的值放入新数组,再遍历新数组,将其给到原数组
int removeElement(int* nums, int numsSize, int val){
int temp[numsSize];
int index=0;
for(int i=0;i<numsSize;i++)
{
if(nums[i]!=val)
{
temp[index++]=nums[i];
}
}
for(int i=0;i<index;i++)
{
nums[i]=temp[i];
}
return index;
}
此处时间复杂度为O(N),空间复杂度为O(N)
思路三:
使用两个变量,src和dest,只要src所在位置不等于所给元素,就赋给dest所在位置并使dest++
int removeElement(int* nums, int numsSize, int val){
int src=0,dest=0;
while(src<numsSize)
{
if(nums[src]!=val)
{
nums[dest++]=nums[src];
}
src++;
}
return dest;
}
此处时间复杂度为O(N),空间复杂度为O(1)
当然,因为这里要求不增加额外空间,所以第三种思路能够实现