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

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

🌳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


相关文章
|
4月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
61 0
|
2月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
128 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
2月前
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
|
3月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
3月前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
58 0
|
4月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
4月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
72 2
|
4月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
4月前
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)
|
4月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题