首页 > 其他分享 >双指针法,高效移除数组特定值(思路+实现)

双指针法,高效移除数组特定值(思路+实现)

时间:2024-07-12 14:58:34浏览次数:17  
标签:slow nums ++ fast int 数组 移除 指针

题目

在这里插入图片描述

①双指针解决本题的思路

1.明确双指针slow、fast的作用:

1_1.slow:
数组该更新的位置,
“新数组”(最终数组)的个数。

	注意:本题新数组可以不需要辅助空间,而下一篇文章(有序数组的平方,就需要辅助数组)

1_2.fast:
遍历原数组(初始数组)

2.双指针工作原理:(T是我们要删除的元素)

fast用于遍历原数组,结果无非就是两种(fast遍历到的值等于T ,不等于T)。

2_1.nums[fast]==T时:

nums[slow++]=nums[fast++];
更新slow,并指向一下需要更新的位置。(不删除元素的操作在这里体现)

2_2.nums[fast]!=T时:

fast++;
不能更新slow,slow同时也表示未删除元素的个数。(删除元素的操作在这里体现)

2_3.使用resize成员方法,删除slow位置以及之后的元素。

参resize方法的参数就是slow,因为slow的第二层含义:新数组的个数!

动画演示:

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="T1fRDjR0-1720767420260" src="https://live.csdn.net/v/embed/408944"></iframe>

双指针高效删除特定元素

②代码实现

两种分析的情况最终都有fast++,所以最终还可以优化代码编写(代码实现里展示)
时间复杂度O(n),且空间复杂度O(1)
class Solution {
public:
    int removeElement(vector<int>& nums, int val) 
    {
    	int slow=0;
    	int fast=0;
    	
    	while(fast<nums.size()){
    	    if(nums[fast]!=val){nums[slow++]=nums[fast];}
    		fast++;//代码优化成这样,自己体会一下
		}
		
		nums.resize(slow);
      	return slow;
    }

};

标签:slow,nums,++,fast,int,数组,移除,指针
From: https://blog.csdn.net/kchick/article/details/140365514

相关文章

  • 从零开始学习嵌入式----C语言指针函数
    目录拨开迷雾:深入浅出C语言指针函数一、指针?函数?傻傻分不清楚二、指针函数闪亮登场三、抽丝剥茧:解析指针函数四、实例讲解:指针函数的应用五、总结拨开迷雾:深入浅出C语言指针函数    指针,一直是C语言学习路上的「拦路虎」,而指针函数更是让许多初学者望而却......
  • 从零开始学习嵌入式----C语言函数指针
    C语言的函数指针:从入门到深入理解    函数指针是C语言中一个强大且灵活的特性,它允许我们将函数作为参数传递给其他函数,或者将函数存储在数据结构中。正确理解和使用函数指针可以帮助我们编写更加模块化、高效和可扩展的代码。一、什么是函数指针?    在C......
  • js 数组方法 - 查找 - indexOf()、includes()、find()、findIndex()、filter()、lastI
    indexOf()该方法可以返回数组中指定元素的索引,如果不存在,则返回-1。constarr=["apple","banana","orange"];constindex=arr.indexOf("banana");console.log(index);//输出:1constarr2=["aaa","bbb","ccc",9......
  • TS定义数组 ts声明函数
    ts定义数组//定义整数型数组constarr1:number[]=[]constarr1_1:Array<number>=[]//定义字符窜型数组constarr2:string[]=[]constarr2_1:Array<string>=[]//定义对象型数组constarr3:object[]=[]constarr3_1:Array<Object>......
  • C语言基础:指针
    1指针的基本概念1.1变量的地址在计算机内存中,每个变量都有一个唯一的内存地址,指针是存储这些地址的特殊变量。换句话说,指针是一个变量,其值为另一个变量的地址。1.2指针的声明和赋值在C语言中,使用指针需要以下基本操作:声明指针:使用*符号声明指针变量,指定指针所指......
  • 【数组、特殊矩阵的压缩存储】
    目录一、数组1.1、一维数组1.1.1、一维数组的定义方式1.1.2、一维数组的数组名1.2、二维数组1.2.1、二维数组的定义方式1.2.2、二维数组的数组名二、对称矩阵的压缩存储三、三角矩阵的压缩存储四、三对角矩阵的压缩存储五、稀疏矩阵的压缩存储一、数组概述:数组是......
  • 代码随想录算法训练营第六天 | Python | LeetCode242.有效的字母异位词、LeetCode349.
    哈希表理论https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html一般哈希表都是用来快速判断一个元素是否出现集合里。数组/set/mapLeetCode242.有效的字母异位词题目链接:https://leetcode.cn/problems/valid-anagr......
  • C++冒泡排序(使用vector动态数组)
    #include<iostream>#include<vector>usingnamespacestd;voidsort(vector<int>&a){  constintsize=a.size();  inttemp;  intflag=1;  while(flag==1)  {  flag=0;  for(inti=0;i<size;++i)  {   if(a[i]>......
  • PTA 7-2 数组循环左移--C++
    本题思路:本题可以用数组或者指针来解决问题,本题我们如果我们用数组来解决问题的话,数组循环左移,就相当后面的数组右移过来,如i位置的就相当于i+m的位置的数组,大概这样的思路,就没有问题了#include<iostream>usingnamespacestd;intmain(){intn,m;cin>>n>>m;......
  • 数组的用法
    关于数组就是讲一组数据写入在一个组合当中举例intarr1[]=newint[]{1,2,3,4}int数据类型arr1变量名(注意此处后面要加()这个是固定格式newint[]固定格式{数据的内容要用,隔开}当然也可以写成这样intarr1[]={1,2,3,4}两者的效果一样均可以使用,具体看自己这么写......