【超硬核】还不知道怎么入门算法?这篇双指针让你吃到饱【力扣真题】+【算法图解】(上)

简介: 【超硬核】还不知道怎么入门算法?这篇双指针让你吃到饱【力扣真题】+【算法图解】

🌳1.为什么学算法?


       算法,是现在互联网行业选拔人才的一个重要标准,每个公司的面试都会或多或少的涉及到各种算法,算法能力能最直观地提现出一个人的代码逻辑思维和能力。在大厂,算法能力不行几乎是无法拿下offer的,即使中小型公司,给HR体现优秀算法能力,能让你在后续的薪资谈判中握有更多的筹码,一句话,优秀的算法能力决定了你的钱途上限。


🌳2.算法为什么要从双指针学习开始?


😭1.高校缺乏系统的算法学习


       相信大多数的初学者都是大一学生,学生开设的数据结构与算法我也上过,课程进度快课时少,侧重于数据结构,对于算法只粗略涉及部分基础的排序算法。许多对算法感兴趣的学生根本不知道如何去学习算法,进而像无头苍蝇一样,四处碰壁最后放弃


😭2.初学者容易好高骛远


       双指针算法可能有的人都没听过,但一说到什么动态规划,贪心算法,递归。他嘎嘎带劲的开始讲起来,给他一道题他能写一个钟,写的代码又长bug又多,找一个钟bug,最后把答案的代码扒下来提交,又看不懂。久而久之就失去了对算法的兴趣。


😀3.双指针简单,逻辑性强,可作为学习算法的基础


       双指针是一种很底层的算法,它可以作为其他的算法的基础,就像某些排序算法,其实都是以双指针的思想。它的逻辑生动形象,通过画图,很容易让初学者接受,并感受到算法的奥妙和趣味,算法能力提高以后,对于后续更难的算法学习才有了一定的基础。正所谓要会跑得先会走,双指针正是我们学习算法的开胃菜。


🌳3.什么是双指针?


很多小白都是从C语言开始学习,听到C指针,就以为是C语言里的指针,这里千万不能搞错,双指针是一种思想,在任何语言都是适用的。它一般是分为左指针和右指针,左指针我们通常为int left,右指针为int right。首先我们要明白,数组在代码中应用的场景是非常广泛的,我们访问数组元素时通过它的下标访问,而它的下标为是int变量的,所以我们的左右指针其实是一个int变量的整数。它们时刻保存着数组中某两个下标。


🌷 下面为双指针最基础的应用场景:


image.png


         如图我们能看出:指针只是我们虚拟想象出来的,它只是好像指向数组某个数据域,其实它只是一个简单的int变量,我们通过访问它来访问它指向数组的元素。比如我要获得左指针left的值,这个数组是arr,我可以写arr[left],获得右指针的值为arr[right]。我们通过对变量的加减来实现指针的移动,比如我left++,left就向右移动一位到了下标为1的位置,right--,右指针就指向到了下标为n-2的位置。就这样通过不断的移动,达到我们在算法题目中要求,这就是双指针思想。


🌳4.双指针的应用场景


🎨 1.同向快慢双指针


        首先我们要清楚,双指针虽然叫分为左右双指针,但它刚开始并不一定是一个在左一个在右,只是在它们不断的移动过程中,会有快慢之分,所以我们为了区别才称之为快慢指针,所以在最开始定义时,它们有可能是在同一边出发的。下面通过一道力扣真题来初步尝试一下。


🌞 删除有序数组的重复项


题目:


给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。


不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。


给上题目链接:删除有序数组的重复数https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/


💚 思路:做算法题和做数学题一样,我们需要抓住关键信息,这个数组是有序数组。同样我们要分析这个有序的含义,既然是有序的,那么重复的元素肯定是相邻的。即当我们的快慢指针同时从左侧开始运动后,每次快指针移动一格后同时与前一位进行判断是否相等,如果相同那快指针就继续移动,当我们判断到不相等时,这时说明我们的快指针指向了一个新元素,这时将快指针的元素赋值给慢指针,然后两个指针同时向右移动1位,直到快指针遍历完整个数组,这时慢指针前面的元素全都是不重复的,我们返回慢指针的值就是答案。觉得还有点抽象的可以搭配下面图食用


❤️ 核心:慢指针指待赋值的位置,快指针用来遍历数组查找新元素  


❗️ PS:循环考虑时,需要先判断数组长度,如果为0,我们直接返回0即可。如果不为0,那么无论最后怎么删除,最少也会剩一个元素,所以我们快慢指针的起始位置都在下标为1处,希望能认真理解这里的意思


image.png

image.png

image.png


相关文章
|
6月前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
268 10
|
7月前
|
机器学习/深度学习 算法 机器人
强化学习:时间差分(TD)(SARSA算法和Q-Learning算法)(看不懂算我输专栏)——手把手教你入门强化学习(六)
本文介绍了时间差分法(TD)中的两种经典算法:SARSA和Q-Learning。二者均为无模型强化学习方法,通过与环境交互估算动作价值函数。SARSA是On-Policy算法,采用ε-greedy策略进行动作选择和评估;而Q-Learning为Off-Policy算法,评估时选取下一状态中估值最大的动作。相比动态规划和蒙特卡洛方法,TD算法结合了自举更新与样本更新的优势,实现边行动边学习。文章通过生动的例子解释了两者的差异,并提供了伪代码帮助理解。
434 2
|
10月前
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
|
11月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
227 4
|
12月前
|
算法
【链表】算法题(二) ----- 力扣/牛客
【链表】算法题(二) ----- 力扣/牛客
|
12月前
|
算法 数据挖掘
【栈和队列】算法题 ---- 力扣(二)
【栈和队列】算法题 ---- 力扣
|
12月前
|
存储 算法
【栈和队列】算法题 ---- 力扣(一)
【栈和队列】算法题 ---- 力扣
|
11月前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
151 0
|
12月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
12月前
|
算法
【链表】算法题(一) ----- 力扣 / 牛客
【链表】算法题(一) ----- 力扣 / 牛客

热门文章

最新文章