快慢指针法指的就是操作数组、链表及字符串等使用两个起点相同但前进步数不同的指针。相对于利用多次循环解决问题,快慢指针法的时间复杂度较低,执行效率高。对于快慢指针法根据题目可供调整的无非就为两点:

  1. 起点
  2. 前进步数

快慢指针法起点位置的选择通常是采取一个 if else 语句进行判断,而在未达到正确起点位置时,两个指针的前进步数将保持一致。而实现快慢指针前进步数不一致移动的方法通常是采取一个 for 循环进行移动指针,注意越界问题。此处 for 循环迭代有两种方案:

  1. 既可以设置快慢指针的步数一致,再在 if 判断成功后进行调整步数,
  2. 也可以仅仅设置快指针的迭代,再 if 里设置慢指针的迭代,判断失败则慢指针不前进,从而实现两者步数调整

在对于基本的快慢指针的框架有所认知之后,即前置双指针的值一致,再使用一个 for 循环在未达到正确起点位置前进行快慢指针的同时移动且为相同步数,在达到正确起点时,将快指针的前进步数调整为大于慢指针即可,我们将来对于一道简单的 LeetCode 题目进行练习。

数组元素移除

题目链接:27.移除元素

题目描述

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

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

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

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {print(nums[i]);
}

示例 :

示例一

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例 二:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100

题目分析

简单介绍一下题目,输入一个数组以及目标值,对数组内符合目标值的值删除即可。由于数组空间连续,只能采用删除目标值后的元素一一前移,完成删除。如果不使用快慢指针法,而是使用双层 for 循环进行暴力循环删除的话,对应的时间复杂度将会是 O(n2),执行效率较低,但仍能解决问题。快慢指针法思路如下:

  1. 定义两个指针变量,起始值皆为 0
  2. 嵌套一个 for 循环实现指针移动,设置快指针迭代
  3. 进行指针起点判断:如果非目标值,快指针与慢指针所指向的元素交换
  4. 完成数组循环,返回慢指针即可

程序代码如下:

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

刷题算法:快慢指针法相关推荐

  1. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...

  2. 兜兜的乐扣刷题算法小记(不停更)

      根据题目,分析数据,找到规律!!!!!!!!题目数量很多,要想基本都会,就必须多练多见.量变导致质变.         "画图"帮助理解 Recursive Tree.     ...

  3. 【刷题】剑指Offer篇

    本文中的部分图片摘自相关题解榜主,如有侵权,请联系删除. 特别感谢k神在剑指Offer刷题路上提供的清晰图解.和堪称完美的思路与方法 小文目录: T3:数组中重复的数字 T3-2:不修改数组找出重复的 ...

  4. Leetcode刷题笔记——剑指offer II (六)【图】

    文章目录 图 695. 岛屿的最大面积 剑指 Offer II 106. 二分图 (每条边的两个结点都来自不同的集合) 剑指 Offer II 107. 矩阵中的距离 (最短路问题,建图,BFS) 剑 ...

  5. 【C++】——快速排序(前后指针,挖坑法,快慢指针法)

    一.前后指针法 基本思路: 1.将数组的第一个数a[left]作为基准数key. 2.分区过程:right开始向前找比key小的数(end找小);数组的首元素left开始向后找比key大的数(begi ...

  6. 【牛客刷题-算法】 NC19 连续子数组的最大和

    个人主页:清风莫追 推荐一款好用的面试.刷题神器牛客网:

  7. 刷题 - 算法(一)

    题目一 :二分查找和 278. 第一个错误的版本 注意边界的变化方式.一般是 high = mid + 1 但有的时候可能没有 +1,甚至有 -1. 题目二:35. 搜索插入位置 二分法难点就在于开闭 ...

  8. 力扣刷题笔记——剑指offer100题

    位运算 Java位运算符:Java移位运算符.复合位赋值运算符及位逻辑运算符 1. 整数除法 题目描述: 给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 '*'.除号 '/' ...

  9. leetcode刷题之 剑指offe 面试题05. 替换空格 犯傻记录

    2020.3.6 刷到剑指offer第5题,题目描述如下: 题目本身没啥好说的,就是先统计空格的个数,然后把长度增加,用两个指针从后往前插. 采用m = s.count(' ',0,len(s)-1) ...

最新文章

  1. 机器学习入门(16)— CNN 池化层概念和特征
  2. cURL error 60: SSL certificate problem: unable to get local issuer certifica 解决
  3. python中bin函数的用法_Python 3标准库用法--ascii()、bin()、breakpoint()函数
  4. Sublime Text 2 中运行 PHP
  5. ubuntu12.04平台下a80编译环境搭建
  6. 40名大学生被退学,教育部表态:学生对自己不负责,就要付出代价
  7. spark学习-50-Spark的stage的划分
  8. linux 给权限命令,Linux小白实用命令--权限设置
  9. 语音信号处理基础(五)——语音分帧与加窗
  10. arduino atmega328P MCP4725 proteus 仿真 程序
  11. IDM与其他下载器加速器优缺点介绍
  12. fiddler4在win7抓取https的配置整理
  13. 在哪里写博客比较好?不同写作平台的横向对比
  14. Kali Linux——小白安装过程(2021)
  15. IIS 6 UrlRewrite 步骤
  16. type=“text/javascript“什么意思?
  17. 电脑文件怎么显示后缀名
  18. C++:应用有限差分法求解 稳平流扩散方程 v*ux-k*uxx=0 in 一个空间维度,具有恒定的速度 v 和扩散系数 k(附完整源码)
  19. 唐山初中计算机考试知识点,唐山:2017小升初英语必考的十个知识点(推荐)...
  20. ubuntu内存不足1G解决办法

热门文章

  1. w7无法訪问计算机上硬盘分区,惠普笔记本win7系统无法调整硬盘分区的解决方法...
  2. 图片预加载与addLoadEvent
  3. 单个按键,实现单击+双击+长按
  4. 推荐给中学生的数学课外书:《数学与生活》
  5. 你知道Oracle的数据文件大小有上限么?
  6. 【软件工程】一、初识软件工程
  7. 小程序源码:最新wordpress黑金壁纸微信小程序 二开修复版-多玩法安装简单
  8. 14种鼻型图解_没有鼻尖(14种鼻型图解)
  9. 前端websocket打造实时聊天室
  10. freeCodeCamp “正向先行断言和负向先行断言“ 练习