算法每日双题精讲——双指针(快乐数,盛最多水的容器)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟

别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧!💪


目录

💯前言

💯快乐数

题目描述:

⭐解题思路:

🙋这个解题思路是怎么来的呢?  

代码实现(C++为例):

👀时间复杂度和空间复杂度

💯盛最多水的容器

题目描述:

⭐解题思路:

🙋这个解题思路是怎么来的呢?  

代码实现(C++为例):

👀时间复杂度和空间复杂度

💯总结


💯前言

在算法的奇妙世界里,双指针技巧宛如一把神奇的钥匙,能够开启许多难题的解决之门😎。

今日,就让我们一同深入探究两道借助双指针策略破解的经典题目:快乐数盛最多水的容器

📣由于俩道题目均为数组,这里的双指针算法指的是:利用数组下标代替指针

当我们遇到,数组分块,数组划分的问题时,可以考虑使用双指针法。 


💯快乐数


题目链接👉【力扣】

题目描述:

编写一个算法来判断一个数 n 是否为 “快乐数”。

“快乐数” 定义为

  1. 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,
  2. 然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。
  3. 如果这个过程结果为 1,那么这个数就是快乐数。

示例:

  • 输入:n = 19
  • 输出:true
  • 解释:
    • 1^2 + 9^2 = 82
    • 8^2 + 2^2 = 68
    • 6^2 + 8^2 = 100
    • 1^2 + 0^2 + 0^2 = 1

⭐解题思路:

我们可以使用双指针法来解决这个问题。定义一个快指针 fast 和一个慢指针 slow,初始时都指向数字 n。快指针每次计算下一个数时,会连续计算两次平方和,而慢指针每次只计算一次。通过不断重复这个过程,如果快指针等于 1,说明该数是快乐数;如果快指针等于慢指针且不等于 1,说明进入了循环,该数不是快乐数。

🙋这个解题思路是怎么来的呢?  

我们进行画图:

 

我们发现该题目像极了,环问题,因此我们的解题思路为快慢指针。 

代码实现(C++为例):
class Solution {
public:// 计算整数 n 各个数位上数字的平方和int sumN(int n) {int sum = 0;// 循环计算每个数位上数字的平方和while (n!= 0) {int t = n % 10;  // 取出 n 的最后一位数字sum += t * t;    // 将该数字的平方累加到 sum 中n = n / 10;      // 去掉 n 的最后一位数字}return sum;}// 判断整数 n 是否为快乐数bool isHappy(int n) {int slow = n;    // 慢指针,初始值为输入的整数 nint fast = sumN(n);  // 快指针,初始值为 n 的各个数位数字平方和// 使用快慢指针法检测是否存在循环while (slow!= fast) {slow = sumN(slow);   // 慢指针每次移动一步fast = sumN(sumN(fast));  // 快指针每次移动两步}return slow == 1;   // 如果慢指针等于 1,则说明 n 是快乐数}
};
👀时间复杂度和空间复杂度

时间复杂度:

  • 计算单个数字的数位平方和的时间复杂度为O(logn) ,因为数字的位数与 logn 成正比。
  •  isHappy 函数中,使用快慢指针法来判断是否为快乐数,在没有循环的情况下,时间复杂度取决于达到 1 的步数,最多不会超过O(logn) 。如果存在循环,时间复杂度也不会超过 O(logn),因为每次计算数位平方和都会使数字减小,最终会收敛到一个较小的范围。

空间复杂度:

  • 代码中只使用了有限的几个变量,不随输入规模增长,所以空间复杂度为O(1) 。


💯盛最多水的容器


题目链接👉【力扣】

题目描述:

给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

示例:

  • 输入:height = [1,8,6,2,5,4,8,3,7]
  • 输出:49
  • 解释:图中垂直线代表输入数组 height。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49

⭐解题思路:

使用双指针法,一个指针指向数组的开头 left,一个指针指向数组的末尾 right。计算当前指针所构成容器的面积,面积等于两指针之间的距离乘以较小的高度 min(height[left], height[right])。然后根据高度大小移动指针,如果 height[left] < height[right],则将left 指针向右移动一位;否则将  right指针向左移动一位。重复这个过程,不断更新最大面积,直到 left right 指针相遇。

🙋这个解题思路是怎么来的呢?  

 

当宽度下降时,我们只要找高度比原来高的来计算新的体积 ,进行比较,找出最大的体积

 我们画图如下:

此时宽度最长

 left<right,我们让left++

right<left,我们让right--
以此类推,直到left==right

代码实现(C++为例):
class Solution {
public:// 计算给定高度数组中容器的最大盛水量int maxArea(vector<int>& height) {int left = 0;         // 左指针,初始指向数组首位置int right = height.size() - 1;  // 右指针,初始指向数组尾位置int V = (right - left) * min(height[left], height[right]);  // 初始盛水量while (left < right) {if (height[left] < height[right]) {left++;  // 如果左指针指向的高度较小,左指针右移} else {right--; // 如果右指针指向的高度较小,右指针左移}int newV = (right - left) * min(height[left], height[right]); // 新的盛水量V = max(V, newV); // 更新最大盛水量}return V;}
};
👀时间复杂度和空间复杂度

时间复杂度:

  • 由于只需要对数组进行一次遍历,所以时间复杂度为 O(n),其中 n 是数组的长度。

空间复杂度:

  • 代码中只使用了有限的几个变量,不随输入规模增长,所以空间复杂度为O(1) 。


💯总结

通过对快乐数和盛最多水的容器这两道题目的深入剖析,我们清晰地领略到了双指针算法在解决不同类型数组问题时所展现出的独特魅力与强大效能👏。它能够帮助我们巧妙地规避复杂的嵌套循环,以简洁高效的方式找到问题的答案。希望大家在今后的算法学习征程中,能够灵活运用双指针技巧,犹如掌握了一把锐利的武器,轻松攻克更多复杂的算法难题💪。 


我将持续在算法领域深耕细作,为大家带来更多精彩的算法知识讲解与问题解析。欢迎大家关注我

👉【A Charmer】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/8979.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第551题学生出勤记录I

题目&#xff1a; 题解&#xff1a; bool checkRecord(char* s) {int absents 0, lates 0;int n strlen(s);for (int i 0; i < n; i) {char c s[i];if (c A) {absents;if (absents > 2) {return false;}}if (c L) {lates;if (lates > 3) {return false;}} els…

【未解决】vite反向代理问题

文章目录 可行网页直接访问&#xff0c;数据正常返回不使用反向代理&#xff0c;直接用axios可以得到数据postman测试也正常 不行-vite反向代理出问题case1命令行测试 可行 网页直接访问&#xff0c;数据正常返回 在地址栏输入 https://api.binance.com/api/v3/ticker/price?…

github使用基础

要通过终端绑定GitHub账号并进行文件传输&#xff0c;你需要使用Git和SSH密钥来实现安全连接和操作。以下是一个基本流程&#xff1a; 设置GitHub和SSH 检查Git安装 通过终端输入以下命令查看是否安装Git&#xff1a; bash 复制代码 git --version配置Git用户名和邮箱 bash …

9_api_intro_imagerecognition_ocr2word

通用图片 OCR 到 Word API 数据接口 高可用图像识别引擎&#xff0c;基于机器学习&#xff0c;超精准识别率。 1. 产品功能 通用的识别接口&#xff0c; 支持多种图片格式&#xff1b;支持中英文字符混合识别&#xff1b;支持 Base64 以及网络地址传参&#xff1b;基于机器学习…

深度优先搜索之全排列问题(C语言版)

本文的一些参考&#xff1a; DFS (深度优先搜索) 算法详解 模板 例题&#xff0c;这一篇就够了_dfs算法-CSDN博客 首先把深度优先搜索算法的基本概论摆出来 深度优先搜索算法&#xff08;Depth First Search&#xff0c;简称DFS&#xff09;&#xff1a; 一种用于遍历或搜…

如何防止苹果MacOS进入休眠状态

前言 远程控制的时候&#xff0c;发现MacOS已经进入了休眠状态。如何设置MacOS&#xff0c;防止其进入休眠状态&#xff0c;这样才能远程控制。 1、进入系统偏好设置 显示器自动关闭了不要紧。只要操作系统不进入休眠就可以。

云计算:定义、类型及对企业的影响

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 云计算&#xff1a;定义、类型及对企业的影响 云计算&#xff1a;定义、类型及对企业的影响 云计算&#xff1a;定义、类型及对企…

Pr 视频过渡:沉浸式视频

效果面板/视频过渡/沉浸式视频 Video Transitions/Immersive Video Adobe Premiere Pro 的视频过渡效果中&#xff0c;沉浸式视频 Immersive Video效果组主要用于 VR 视频剪辑之间的过渡。 自动 VR 属性 Auto VR Properties是所有 VR 视频过渡效果的通用选项。 默认勾选&#x…

ArcGIS Pro SDK Addin-DAML

ArcGIS Pro SDK Addin-DAML 文章目录 ArcGIS Pro SDK Addin-DAML1 Panes: 重置窗格2 Button: 从功能区中移除核心按钮3 Button: 将新按钮插入功能区上的现有组4 Menu: 在图层上下文菜单中插入一个新按钮5 Menu: 在 Map Container 上下文菜单中插入新菜单6 Menu: 在2D Map上下文…

【电机控制器】STC8H1K芯片——ADC电压采集

【电机控制器】STC8H1K芯片——ADC电压采集 文章目录 [TOC](文章目录) 前言一、ADC1.ADC初始化1.ADC_CONTR2.ADCCFG3.ADCTIM4.代码 2.ADC读取1.ADC_RES、ADC_RESL2.代码 3.VREF电压读取——MCU工作电压1.MCU工作电压计算公式2.代码 4.ADC被转换通道的输入电压读取1.ADC被转换通…

SpringBoot基础系列学习(三):日志

文章目录 一丶日志控制台介绍二丶日志的用法三丶日志级别四丶配置文件参数及介绍五丶slf4j 一丶日志控制台介绍 只要引用了spring-boot-starter依赖,就无需引入日志依赖,里面自带了logging依赖,默认情况下,springBoot使用Logback来记录日志,并用INFO级别输出到控制台 二丶日…

鸿蒙系统:安卓与iOS的强劲对手

随着科技的迅猛发展&#xff0c;“纯血鸿蒙”系统HarmonyOS Next 5.0系统的推出引起了业界的广泛关注。用户们对这一新系统充满好奇&#xff0c;急切地想要体验其带来的变革。鸿蒙系统以其创新的设计和技术支持&#xff0c;成为与安卓和iOS并列的第三大操作系统。 鸿蒙系统的独…

Redis - 哨兵(Sentinel)

Redis 的主从复制模式下&#xff0c;⼀旦主节点由于故障不能提供服务&#xff0c;需要⼈⼯进⾏主从切换&#xff0c;同时⼤量 的客⼾端需要被通知切换到新的主节点上&#xff0c;对于上了⼀定规模的应⽤来说&#xff0c;这种⽅案是⽆法接受的&#xff0c; 于是Redis从2.8开始提…

Golang | Leetcode Golang题解之第552题学生出勤记录II

题目&#xff1a; 题解&#xff1a; const mod int 1e9 7type matrix [6][6]intfunc (a matrix) mul(b matrix) matrix {c : matrix{}for i, row : range a {for j : range b[0] {for k, v : range row {c[i][j] (c[i][j] v*b[k][j]) % mod}}}return c }func (a matrix) p…

放电电阻是什么

放电电阻&#xff0c;顾名思义&#xff0c;就是用于放电的电阻。在电路中&#xff0c;当电流突然增大时&#xff0c;如果没有适当的电阻来限制电流&#xff0c;就可能导致电路损坏。因此&#xff0c;放电电阻的作用就是在电路中起到限制电流的作用&#xff0c;防止电路因电流过…

CelebV-Text——从文本生成人脸视频的数据集

概述 近年来&#xff0c;生成模型在根据文本生成和编辑视频方面受到了广泛关注。然而&#xff0c;由于缺乏合适的数据集&#xff0c;生成人脸视频领域仍然是一个挑战。特别是&#xff0c;生成的视频帧质量较低&#xff0c;与输入文本的相关性较弱。在本文中&#xff0c;我们通…

【51单片机数码管的控制开机时前四位数码管显示0000,每按下一次按键后松开数字加121,当数字大于等于8888时清零。】2022-3-18

缘由51单片机数码管的控制-嵌入式-CSDN问答 #include "REG52.h" sbit K1 P3^1; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111,128,119,124,57,94,121,113};//0-9. void smxs(unsigned char mz, unsigned char w) {unsigned char Xd0;P2255;P2255…

境内部署DIfy(中篇)

背景&#xff1a; 接 本文上篇中已经讲述了比较友好的一种境内安装Dify 的方式&#xff0c;这种方式可以拉取到最新的镜像源&#xff0c;最新的版本&#xff0c;最为推荐的方案。但由于各种原因或多或少会出现上述方式不成功的可能&#xff08;镜像源又被屏蔽&#xff09;&…

【人工智能】利用大语言模型(LLM)实现机器学习模型选择与实验的自动化

文章目录 引言环境准备数据集说明 项目结构主要文件说明 导入必要的软件包软件包功能简述 辅助函数定义加载配置文件加载数据集预处理数据集函数功能详解 集成LLM进行模型选择调用LLM的函数定义函数功能详解 清理和验证LLM的输出清理超参数建议提取模型名称验证超参数修正超参数…

我与Linux的爱恋:基础IO 软硬连接+动静态库

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:Linux的学习 文章目录 一、软硬链接使用对应的特征 内容 以及作用二、动态库静态库的制作打包与使用生成静态库库搜索路径动态库的打包以及使用生成动态库一、软硬链接 使用 软连接 硬链接​ ​ 通过观察我们可以发现: 1.l…