前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >力扣27.移除元素【顺序表】

力扣27.移除元素【顺序表】

作者头像
阿伟@t
发布2023-10-10 15:09:23
1120
发布2023-10-10 15:09:23
举报
文章被收录于专栏:cs阿伟cs阿伟

前言:

在解题过程中一定要画图进行思考,然后再敲代码。

移除元素

初学数据结构顺序表,要求时间复杂度为O(N),空间复杂度为O(1):

题目要求:

题目分析:

思路1:

查找一个删除一个,与顺序表中查找的思路一样。

时间复杂度:O(N2),最坏的情况是数据基本都与val相等,删除一个的时间复杂度为O(N),删除N个为O(N2)。

在这里插入图片描述
在这里插入图片描述
思路2:

提供一个临时数组tmp,以空间换时间,不进行挪动。

当,src指向0时,0 != val , 此时将src指向的值赋值到dst指向的位置,src和dst都向后挪动以为,开始寻找下一个。若src指向的值等于val,则dst位置不变,src向后挪动。

最后用tmp中的值从起始位置覆盖原来的数据,释放tmp并改动size的位置以删除后面的元素。

思路3:

再优化,不创临时数组,直接在原始数据上进行操作,使用双指针。

时间复杂度O(N)

空间复杂度O(1)

开始时src和dst都指向初始位置,src负责和val进行比较,当src指向的值不等于val时,将这个值放到dst指向的位置,然后src和dst一起向后挪动。

当src指向的值=val时,dst不动,src向后偏移。

最终代码:
代码语言:javascript
复制
int removeElement(int* nums, int numsSize, int val)
{
int dst = 0,src = 0;
while(src<numsSize)//结束标志src>=numsize
{
     if(nums[src] == val)
     {
         src++;
     }
     else
     {
         nums[dst] = nums[src];
         src++;
         dst++;
     }
}
    return dst;//dst刚好是最后一个元素下一个位置,下标=size
}

为了减少代码量,也可以采取以下两种写法:

代码语言:javascript
复制
int removeElement(int* nums, int numsSize, int val)
{
int dst = 0,src = 0;
while(src<numsSize)//结束标志src>=numsize
{
     if(nums[src] == val)
     {
         src++;
     }
     else
     {
         nums[dst++] = nums[src++];
     }
}
    return dst;//dst刚好是最后一个元素下一个位置,下标=size
}
代码语言:javascript
复制
int removeElement(int* nums, int numsSize, int val)
{
int dst = 0,src = 0;
while(src < numsSize)//结束标志src>=numsize
{
     if(nums[src] != val)
         nums[dst++] = nums[src];
        
    src++;
    
}
    return dst;//dst刚好是最后一个元素下一个位置,下标=size
}

结语:

走到这里本题就介绍完了, 希望以上内容对大家有所帮助👀,如有不足望指出🙏

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 移除元素
    • 题目要求:
      • 题目分析:
        • 思路1:
        • 思路2:
        • 思路3:
        • 最终代码:
    • 结语:
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档