【代码随想录打卡】快慢指针

这篇具有很好参考价值的文章主要介绍了【代码随想录打卡】快慢指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

力扣链接: 力扣

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

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

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

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。

示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

你不需要考虑数组中超出新长度后面的元素。

思路:考虑两个指针同时看这个nums数组,快指针跑的快一些(每一个循环都往后走一步),可以先去后面看看元素是什么。而慢指针走的慢一些(只有当快指针丢给他符合条件也就是nums[fast]!=val时才更新),这样慢指针接收到的数永远是fast筛选过符合条件的数。当fast走完一遍,slow指向的就是最后一个符合条件的数的下一个位置。

# 1.快慢指针同向,相当于快指针先跑到后面看看,把后面nums中不是val的值丢给慢指针,慢指针只负责接受不等于val的值
def removeElement(nums, val):
    slow = 0
    fast = 0
    while fast<len(nums):# 快指针看完一遍就该退出了,此时慢指针一定能使所有不为val的值都排在前面
        if nums[fast]!=val:# 快指针看完发现这个值不是val,就丢给慢指针
            nums[slow] = nums[fast]
            slow += 1
        fast += 1
    return slow

nums = [0,1,2,2,3,0,4,2]
val = 2
print(removeElement(nums, val))

如果删除指定val元素后剩余元素的顺序不要求和原来相等,那我们还可以用对撞指针,类似与快排用到的方法。文章来源地址https://www.toymoban.com/news/detail-524621.html

# 2.对撞指针,有点像快排,从左往右找到一个为val的值,再从右往左找一个不为val的值,把找到的两个数交换,这样所有不为val都会被换到前面
def removeElement(nums, val):
    left = 0
    right = len(nums)-1
    while left<=right:# left>right时可以退出了,必定已经交换完所有该交换的数了
        while nums[left] != val:
            left += 1
        while nums[right]==val:
            right -= 1
        if left<right:
            nums[left], nums[right] = nums[right], nums[left]
    return left + 1 if nums[left]!=val else left

nums = [0,1,2,2,3,0,4,2]
val = 2
print(removeElement(nums, val))

到了这里,关于【代码随想录打卡】快慢指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 代码随想录Day_52打卡

    给你一个整数数组  nums  ,找到其中最长严格递增子序列的长度。 子序列  是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如, [3,6,2,7]  是数组  [0,3,1,6,2,2,7]  的子序列。 事例: 思路:        使用动态规划,dp含义:dp[i]表示数

    2024年02月10日
    浏览(40)
  • 代码随想录打卡—day41—【DP】— 8.26+27 DP基础3

    343. 整数拆分 一开始做 没有思路,学习了题解才,ac代码: 后来仔细看题解,其实 for - j 的次数可以优化—— 注意 枚举j的时候,是从1开始的。从0开始的话,那么让拆分一个数拆个0,求最大乘积就没有意义了。 优化1: j 的结束条件是 j i - 1 ,其实 j i 也是可以的,不过

    2024年02月11日
    浏览(40)
  • 代码随想录打卡第56天|583. 两个字符串的删除操作;72. 编辑距离

    583. 两个字符串的删除操作 关键点1:dp数组的含义 dp[i][j],使得以i-1为结尾word1 和 以j-1为结尾的word2 相同所需的最小步数; 关键点2:递归公式的推导 if(nums1[i-1] == nums2[j-1]),则i和j同时移动,所以为i-1,j-1;dp[i][j] = dp[i-1][j-1];由于不需要进行删除操作,所以不需要加1 如果不相

    2023年04月19日
    浏览(51)
  • 算法随想录第三十九天打卡|62.不同路径 , 63. 不同路径 II

    本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。  代码随想录 视频讲解: 动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_bilibili 总结 把m和n弄反了。 https://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.htmlhttps://programmercarl.com/00

    2024年01月20日
    浏览(51)
  • 算法随想录第三十八天打卡| 理论基础 , 509. 斐波那契数, 70. 爬楼梯 , 746. 使用最小花费爬楼梯

     理论基础  无论大家之前对动态规划学到什么程度,一定要先看 我讲的 动态规划理论基础。  如果没做过动态规划的题目,看我讲的理论基础,会有感觉 是不是简单题想复杂了?  其实并没有,我讲的理论基础内容,在动规章节所有题目都有运用,所以很重要!   如果

    2024年01月18日
    浏览(46)
  • 代码随想录 图论

    目录 797.所有可能得路径  200.岛屿数量 695.岛屿的最大面积 1020.飞地的数量  130.被围绕的区域  417.太平洋大西洋水流问题  827.最大人工岛 127.单词接龙  841.钥匙和房间 463.岛屿的周长  797. 所有可能的路径 中等 给你一个有  n  个节点的  有向无环图(DAG) ,请你找出所有从

    2024年04月10日
    浏览(47)
  • [代码随想录]二叉树

    二叉树可以链式存储,也可以顺序存储。 那么链式存储方式就用指针, 顺序存储的方式就是用数组。 顾名思义就是顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在各个地址的节点串联一起。 链式存储如图: 链式存储是大家很熟悉的一种方式,那么

    2024年02月03日
    浏览(59)
  • 代码随想录刷题

    704. 二分查找 27. 移除元素

    2024年01月25日
    浏览(51)
  • 代码随想录——回溯

    代码随想录——回溯 回溯的本质就是递归遍历,但在完成某一条路之后会撤回到上一层,然后重新选择另一条路继续遍历,是一个比较低效的算法,能进行提升的方式就是剪枝。 组合 链接:https://leetcode.cn/problems/combinations/description/ vectorvector int 作为最终返回的结果,vector

    2024年01月19日
    浏览(117)
  • 代码随想录——贪心算法

    代码随想录——回溯 代码随想录——贪心算法 分发饼干 链接:https://leetcode.cn/problems/assign-cookies/description/ 这道题我自己一开始的想法是从大到小遍历孩子数组,对于每个元素从大到小遍历饼干数组,满足则total+1,并且该元素置0防止被再次使用。这样虽然是可以的,但时间复

    2024年02月22日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包