首页 > 其他分享 >对撞指针技巧

对撞指针技巧

时间:2024-06-24 12:42:30浏览次数:24  
标签:right 技巧 int 元素 对撞 指针 left

对撞指针技巧

我们以LeetCode的一道题目来讲解一下对撞指针

LeetCode第27题移除元素,链接如下:

https://leetcode.cn/problems/remove-element

如果使用快慢指针

如果使用快慢指针,将会有大量的后面元素赋值给前面元素的操作,有没有其他不进行这么多次交换的思路呢?

对撞指针

我们的目的就是:将需要删除掉的元素放到数组的最后。

实际上,当我们遇到要删除的元素时,直接让数组后面的元素赋给这个元素即可。

这样的话,操作数量就会变少了。

那我们就需要定义一个指针,从后往前移动。

对撞指针思想

示意图

定义left和right两个指针,分别指向数组最开始和最后位置。

[0...left - 1]区间:不需要删除的区域

[left...right]区间:未处理的区域

[right + 1... n - 1]区间:需要删除的区域
  1. 如果left指向的元素值不等于待删除的元素值:left++;
  2. 如果left指向的元素值等于待删除的元素值:直接将right指向的元素赋值给left指向的元素,然后right--;
  3. 重复1和2,直到left > right结束。

代码

class Solution {

    public int removeElement(int[] nums, int val) {
        //判断数组是否合法
        if(nums == null || nums.length == 0) return 0;

        int left = 0, right = nums.length - 1;
        while(left <= right){
            if(nums[left] == val){
                nums[left] = nums[right];
                right--;
            }else{
                left++;
            }
        }

        return left;
    }
}

标签:right,技巧,int,元素,对撞,指针,left
From: https://www.cnblogs.com/nicaicai/p/18264821

相关文章

  • suspendCancellableCoroutine: 深入理解及使用技巧
    作为一名安卓开发工程师,我们在日常开发中经常会遇到需要挂起协程以等待某些异步操作完成的情况。Kotlin的协程为我们提供了丰富的挂起函数,其中一个非常重要且强大的函数就suspendCancellableCoroutine。本文将深入探讨suspendCancellableCoroutine的使用及其内部机制,帮助......
  • Python编程技巧:下划线的11种妙用,看看你知道几种?
    文章目录......
  • Pandas全面指南:数据加载、处理技巧与高级数据选择过滤方法
    Pandas全面指南:数据加载、处理技巧与高级数据选择过滤方法Pandas是Python中一个强大的数据分析库,它提供了快速、灵活和富有表现力的数据结构,旨在使“关系”或“标记”数据的工作既简单又直观。Pandas主要的数据结构有Series(一维标签数组)和DataFrame(二维标签数据结构)。在本......
  • 9. Mybatis 小技巧
    1.#{}和$#{}和${}的区别#{}:先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防止sql注入,比较常用。${}:先进行sql语句拼接,然后再编译sql语句,底层是Statement实现。存在sql注入现象。只有在需要进行sql语句关键字拼接的情况下才会用到。‍什么情况......
  • 9. Mybatis 小技巧
    1.#{}和${}和${}的区别{}:先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防止sql注入,比较常用。${}:先进行sql语句拼接,然后再编译sql语句,底层是Statement实现。存在sql注入现象。只有在需要进行sql语句关键字拼接的情况下才会用到。‍什么情况下......
  • C++ 智能指针
     问题引入intfunc1(intx){ inty=10; int*tmp=(int*)malloc(sizeof(int)*2); if(x==0) throw"func1_error"; else returnx+y; free(tmp);//抛异常造成异常安全问题,无法释放造成内存泄漏,}intmain(){ try{inta=func1(0);} catch(constc......
  • [技巧] NOI LINUX 中不用自己手打的Sublime配置环境
    一般我们测试代码时,需要开$O2$,而$Sublime$中的$C++SingleFile$是没有$O2$的,为此,我们需要手打环境;其实是不用的;第一步,打开“文件”中的“其它位置”中的“计算机”;第二步,在上面的搜索栏中搜索“Sublime”;打开图中高亮的,找到如下图中高亮的并打开,复制;发现会......
  • 20个高效提示词写作技巧,让你的AI更出色
    提示词(prompt)是我们与AI沟通的基础语言。特别是对于目前的生成式人工智能(GenAI),无论是文本AI、视频AI、绘图AI、AI搜索还是AI-Bot,都比较依赖提示词。预计这种依赖,还将持续存在一段较长的时间。今天,我们主要分享20个提示词写作技巧,可直接复制使用。1.压制幻觉提示词1prompt......
  • 二、浅谈 JSON 处理技巧
    1.JSON:一种轻量级的数据交换格式,一般接口返回的数据类型都是JSON。JSON的定义格式与字典相同,也是键值对方式,如{key:value}。其实JSON是字符串,由于字符串不能用key、value来取值,所以要先转换为字典才可以。 2.JSON模块常用的四个方法:(1)json.dumps():将Python任意对象......
  • C语言指针(三)
    数组地址我们知道,数组名即是数组的首地址,因此#include<stdio.h>intmain(){intarr[10]={1,2,3,4,5,6,7,8,9,10};printf("&arr[0]=%p\n",&arr[0]);printf("arr=%p\n",arr);return0;}我们会发现,二者地址相同即 那么如果数组名是首地址,以下代码该怎么解......