C语言移除元素问题解决方法详解

这篇具有很好参考价值的文章主要介绍了C语言移除元素问题解决方法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++,C语言移除元素,算法解析,动态规划

💡题目分析

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

C++,C语言移除元素,算法解析,动态规划
C++,C语言移除元素,算法解析,动态规划
C++,C语言移除元素,算法解析,动态规划
C++,C语言移除元素,算法解析,动态规划

💡解题思路

🚩思路1:暴力求解 — 遍历

直接一个循环遍历nums数组每个元素;
再对每个元素判断是否和val相等;
相等就把后面的元素往前挪动覆盖它,已达到删除val的目的;
🚨注意:移除元素后,要对数组元素个数 -1numsSize-1的同时,还要对第一层的for循环遍历的 ii- -,因为元素移动覆盖时候位置发生变化

👇图解👇
C++,C语言移除元素,算法解析,动态规划

🔔接口源码:

int removeElement(int* nums, int numsSize, int val){
    int tmp = numsSize ; //创建临时变量,返回时候要用
	int count = 0; //统计移除元素的个数
	for(int i = 0; i<numsSize; i++)
	{		
		if(val == nums[i])
		{
			count++;
			for(int j = i; j<numsSize -1; j++)
			{
				nums[j] = nums[j+1];				
			}
            numsSize--;
            i--; //由于元素都是往前挪动了,所以i也要--
		}
	}
	return tmp - count;}

此方法:
时间复杂度:O(N^2)
空间复杂度:O(1)

🚩思路2:空间换时间

创建一个新数组 tmp,大小为 numsSize;
同时把原数组 nums中,不等于 val的数据,放到新数组 tmp中;
然后再把 tmp中的数据拷贝回到原数组 nums中;

👇图解👇
C++,C语言移除元素,算法解析,动态规划

🔔接口源码:

int removeElement(int* nums, int numsSize, int val){
    int *tmp = (int*)malloc(sizeof(int) * numsSize);
    int j = 0;//执行临时数组的下标
    
    //找不等于val的值放到临时数组
    for(int i = 0; i<numsSize; i++){
        if(val != nums[i]){
            tmp[j++] = nums[i];
        }
    }
    //把临时数组的值,覆盖回去
    //上面的循环结束后,j  = 不是val元素的个数
    for(int i = 0; i<j; i++){
        nums[i] = tmp[i];
    }
    return j;}

此方法:
时间复杂度:O(N)
空间复杂度:O(N)

🚩思路3:双指针(快慢指针)

定义两个指针:一个dst,一个src;
dst表示目的地指针,src是原指针,src用来移动寻找不等于val的值;
src找到不等于val的值那么就把它赋值给dst对应的值,即 nums[dst] = nums[src],同时dst++; src++
src碰到与val相等的值,那么src++,其他不变

👇图解👇
C++,C语言移除元素,算法解析,动态规划
C++,C语言移除元素,算法解析,动态规划

🔔接口源码:

int removeElement(int* nums, int numsSize, int val){
    int src = 0;
    int dst = 0;
    while (src < numsSize)
    {
        if (nums[src] != val)
        {
            nums[dst++] = nums[src++];
        }
        else
        {
            src++;
        }
    }
    return dst;}

同理的 ,也可以这样写👇

int removeElement(int* nums, int numsSize, int val){
    int dst = 0;
    for (int src = 0; src < numsSize; src++)
    {
        if (nums[src] != val)
        {
            nums[dst] = nums[src];
            dst++;
        }
    }
    return dst;}

此方法:
时间复杂度:O(N)
空间复杂度:O(1)

C++,C语言移除元素,算法解析,动态规划

🥰希望大家能够理解!

总结🥰
以上就是本题讲解的全部内容啦🥳🥳🥳🥳
本文章所在【C语言刷题】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
前途很远,也很暗,但是不要怕,不怕的人面前才有路。💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰

C++,C语言移除元素,算法解析,动态规划文章来源地址https://www.toymoban.com/news/detail-424000.html

到了这里,关于C语言移除元素问题解决方法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】移除链表元素-图文解析(单链表OJ题)

    LeetCode链接:203. 移除链表元素 - 力扣(LeetCode) 本文导航 💭做题思路 🎨画图更好理解: ✍️代码实现 🗂️分情况讨论: ❄️极端情况: 遍历链表,找到值为 val 的节点删除 这里需要两个指针  cur 用来遍历链表  prev 指向 cur 的前一个位置,方便删除一个节点后,链接前

    2024年02月14日
    浏览(35)
  • 算法刷题-链表-移除链表元素

    链表操作中,可以使用原链表来直接进行删除操作,也可以设置一个虚拟头结点再进行删除操作,接下来看一看哪种方式更方便。 力扣题目链接 题意:删除链表中等于给定值 val 的所有节点。 示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5] 示例 2: 输入:head = [],

    2024年02月08日
    浏览(51)
  • 【每日一题】移除链表元素(C语言)

    移除链表元素,链接奉上 在 正常 情况: 下我们移除链表元素时,需要该位置的 前结点与后节点 , 在 特别 情况时: 例如 我们发现,需要改变头结点,否则因为返回的 head 因为指向的位置被 free ,会导致程序错误 我们调试时可以在VS或其他的软件进行调试,也不用专门搞

    2024年02月05日
    浏览(58)
  • 算法刷题Day1 二分查找+移除元素

    代码随想录-数组-1.数组理论基础 数组是存放在 连续内存空间 上的 相同类型 数据的 集合 优点:常数时间复杂度访问元素 缺点: 在删除或者增添元素的时候,就难免要移动其他元素的地址 ,时间复杂度为O(n) 代码随想录-数组-2.二分查找 前提条件 二分查找前提条件: 数组

    2024年02月10日
    浏览(54)
  • 使用C++实现数组中移除元素的算法

    本篇博客将介绍一种使用C++语言实现的数组中移除元素的算法,算法代码基于代码随想录第三章 算法思路: 有两种算法解决该问题,第一种是暴力解法,也就是两个for循环,算法复杂度为n2。第二个算法基于双索引的思想,只需使用一个for循环,算法复杂度为n。 我们使用两

    2024年02月09日
    浏览(42)
  • 算法-设计链表、移除链表元素、反转链表

    伪装成一个老手! 设计一个单链表,其中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 实现 MyLinkedList 类: MyLinkedList()初始化 MyLinkedList 对象。 int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1

    2024年02月11日
    浏览(97)
  • C语言每日一题:6.移除元素+合并两个有序数组。

    一:暴力查找的方法: 1.找到对应val值的下标,返回数组的下标。 2.删除对应的下标,从前向后用后面覆盖前面。当后一个是数组最后一个数值是就赋值结束了(注意数组越界的问题)。 3.删除了一个数之后数组元素个数要–。 4.查找和删除是在一个循环里面因为val的值可能

    2024年02月15日
    浏览(46)
  • 单链表相关经典算法OJ题:移除链表元素

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 题目:移除链表元素 解法一: 解法一的代码实现: 解法二: 解法二代码的实现: 总结 世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各

    2024年02月04日
    浏览(48)
  • 【LeetCode题目详解】(一些双指针的题目)27. 移除元素

    给你一个数组 nums   和一个值 val ,你需要 原地 移除所有数值等于  val   的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组 。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明: 为什

    2024年01月22日
    浏览(42)
  • 算法:移除数组中的val的所有元素---双指针[2]

    文章来源: https://blog.csdn.net/weixin_45630258/article/details/132689237 欢迎各位大佬指点、三连 1、题目: 给你一个数组 nums和一个值 val,你需要 原地移除 所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地修改 输入

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包