当前位置: 首页 > news >正文

代码随想录——数组——移除元素——双指针

目录

双指针法

 leetcode实战:

 283. 移动零 - 力扣(LeetCode)

 844. 比较含退格的字符串 - 力扣(LeetCode)

977. 有序数组的平方 - 力扣(LeetCode)


双指针法

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

定义快慢指针

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置
  • // 时间复杂度:O(n)
    // 空间复杂度:O(1)
    class Solution {
    public:int removeElement(vector<int>& nums, int val) {int slowIndex = 0;for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {if (val != nums[fastIndex]) {nums[slowIndex++] = nums[fastIndex];}}return slowIndex;}
    };

    注意这些实现方法并没有改变元素的相对位置!

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

自己理解:双指针通过两个指针对数组进行覆盖。

 leetcode实战:

27. 移除元素 - 力扣(LeetCode)

class Solution {public int removeElement(int[] nums, int val) {int slow=0;for(int fast=0;fast<nums.length;fast++){if(nums[fast]!=val){nums[slow++]=nums[fast];}}return slow;}
}

26. 删除有序数组中的重复项 - 力扣(LeetCode)

这里直接用上双指针 , 

  nums[++solw]=nums[fast];

可以分解成:  slow++;

                     num[slow]=nums[fast];

这里slow要++是因为要保留元素唯一。

class Solution {public int removeDuplicates(int[] nums) {int solw=0;for(int fast=0;fast<nums.length;fast++){if(nums[fast]!=nums[solw]){nums[++solw]=nums[fast];}}return solw+1;}
}

 283. 移动零 - 力扣(LeetCode)

 题解:

            采用双指针,0是比较条件,可以把步骤分解为1.覆盖0元素 2.覆盖完后剩下的从slow 进行补零

class Solution {public void moveZeroes(int[] nums) {int slow=0;for(int fast=0;fast<nums.length;fast++){if(nums[fast]!=0){nums[slow++]=nums[fast];}}for(;slow<nums.length;slow++){nums[slow]=0;}}
}

 844. 比较含退格的字符串 - 力扣(LeetCode)

 还是利用双指针的思路,

  这里要注意:

                if(slow>0){
                     slow--;
                 }

slow>0防止出现开头就是#的情况,不然slow会变成-1

这里slow--就是#的前一位,把他作为覆盖位,

最后 new String(s, 0, slow); 进行截取字符串,注意不要用 s.tocharAarry()  这个是将字符数组转化成字符串的地址。

class Solution {public boolean backspaceCompare(String s, String t) {String m=  getstr(s.toCharArray());String n=getstr(t.toCharArray());return m.equals(n);}public String getstr(char s[]){int slow=0;for(int fast=0;fast<s.length;fast++){if(s[fast]!='#'){s[slow++]=s[fast];}else {if(slow>0){slow--;}}}return new String(s, 0, slow);}
}

977. 有序数组的平方 - 力扣(LeetCode)

 思路:这里对每个数进行平方进行排序,可以利用双指针,最左指针和最右指针,两边指针所指向的平方数进行比较,大的一方放到一个新的数组里。

 

 

class Solution {public int[] sortedSquares(int[] nums) {int len=nums.length;int left=0;int right=nums.length-1;int result[]=new int[len];while(left<=right){if(nums[left]*nums[left]<nums[right]*nums[right]){result[--len]=nums[right]*nums[right];right--;}else{result[--len]=nums[left]*nums[left];left++;}}return result;}
}

http://www.dtcms.com/a/304546.html

相关文章:

  • openeuler24.03部署k8s1.32.7高可用集群(三主三从)
  • 《Spring Cloud Config配置中心核心原理与动态刷新方案》
  • Singapore
  • 聚观早报 | 三星获特斯拉AI芯片订单;小米16首发成安卓最强SOC;iPhone 17 Pro支持8倍光学变焦
  • Kubernetes 核心准备:从 Pod 本质到网络模型全解析
  • 作物生长模型Oryza V3实战16:气象数据集
  • 个人健康管理小程序(消息订阅、Echarts图形化分析)
  • 如何调整服务器的内核参数?-哈尔滨云前沿
  • 随着人工智能技术的飞速发展,大语言模型(Large Language Models, LLMs)已经成为当前AI领域最引人注目的技术突破。
  • Apache Ignite Cluster Groups的介绍
  • 多目标粒子群优化(MOPSO)解决ZDT1问题
  • 嵌入式系统分层开发:架构模式与工程实践(一)
  • Spring Boot 2整合MyBatis Plus详细指南
  • 【面试场景题】阿里云子账号设计
  • 从零开始学习Dify-爬取网站文章,批量提取和输出热点摘要(十)
  • CRMEB电商系统集群部署指南:阿里云COS静态文件加速与资源分离最佳实践
  • 聊聊测试环境不稳定如何应对
  • 人工智能与法律:智能司法的创新与挑战
  • C++ 进阶
  • Typecho handsome新增评论区QQ,抖音,b站等表情包
  • 【Clumsy】只是学习记录
  • 晶界能计算
  • flexiblejs + pxtorem 实现浏览器缩放适配:兼顾系统缩放与文本放大体验
  • 图形界面应用程序技术栈大全
  • getgff.py脚本-python006
  • 【学习路线】游戏开发大师之路:从编程基础到独立游戏制作
  • 2025年科研算力革命:8卡RTX 5090服务器如何重塑AI研究边界?
  • react 项目怎么打断点
  • vite + chalk打印输出彩色命令行
  • 基于Dify构建本地化知识库智能体:从0到1的实践指南