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

news2024/11/24 12:51:37

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

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


目录

💯前言

💯快乐数

题目描述:

⭐解题思路:

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

代码实现(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;    // 慢指针,初始值为输入的整数 n
        int 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.coloradmin.cn/o/2236997.html

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

相关文章

在Scrapy爬虫中应用Crawlera进行反爬虫策略

在互联网时代&#xff0c;数据成为了企业竞争的关键资源。然而&#xff0c;许多网站为了保护自身数据&#xff0c;会采取各种反爬虫技术来阻止爬虫的访问。Scrapy作为一个强大的爬虫框架&#xff0c;虽然能够高效地抓取网页数据&#xff0c;但在面对复杂的反爬虫机制时&#xf…

Linux(CentOS)安装 JDK

CentOS版本&#xff1a;CentOS 7 JDK版本&#xff1a;JDK17 1、下载 JDK 官网&#xff1a;https://www.oracle.com/ 2、上传 JDK 文件到 CentOS 使用FinalShell远程登录工具&#xff0c;并且使用 root 用户连接登录&#xff08;注意这里说的root用户连接登录是指这样的&…

redis和数据库的数据一致性

在我们使用redis作为缓存的时候&#xff0c;数据库和缓存数据保持一致性就显得尤为重要&#xff0c;因为如果不做处理的话很有可能读取到的数据会出现差错&#xff0c;那这里怎么进行解决呢&#xff1f; 首先我们先来看一下操作数据到底是直接删除数据还是说通过修改的方式来修…

发布 VectorTraits v3.0(支持 X86架构的Avx512系列指令集,支持 Wasm架构及PackedSimd指令集等)

文章目录 支持 X86架构的Avx512系列指令集支持Avx512时的输出信息 支持 Wasm架构及PackedSimd指令集支持PackedSimd时的输出信息VectorTraits.Benchmarks.Wasm 使用说明 新增了向量方法支持 .NET 8.0 新增的向量方法提供交织与解交织的向量方法YGroup3Unzip的范例代码 提供重新…

工业相机常用功能之白平衡及C++代码分享

目录 1、白平衡的概念解析 2、相机白平衡参数及操作 2.1 相机白平衡参数 2.2 自动白平衡操作 2.3 手动白平衡操作流程 3、C++ 代码从XML读取参数及设置相机参数 3.1 读取XML 3.2 C++代码,从XML读取参数 3.3 给相机设置参数 1、白平衡的概念解析 白平衡(White Balance)…

推荐一款SSD硬盘优化器:Auslogics SSD Optimizer Pro

SSD Optimizer Pro 是一款专为优化固态硬盘 (SSD) 性能而设计的专业工具&#xff0c;旨在最大化 SSD 的效率&#xff0c;延长硬盘使用寿命。凭借简便的操作界面和强大的优化功能&#xff0c;SSD Optimizer Pro 可以让用户充分利用 SSD 的优势&#xff0c;从而获得更高的系统性能…

常用机器人算法原理介绍

一、引言 随着科技的不断发展&#xff0c;机器人技术在各个领域得到了广泛应用。机器人算法是机器人实现各种功能的核心&#xff0c;它决定了机器人的行为和性能。本文将介绍几种常用的机器人算法原理&#xff0c;包括路径规划算法、定位算法和运动控制算法。 二、路径规划算法…

基于开源 AI 智能名片 S2B2C 商城小程序的视频号交易小程序优化研究

摘要&#xff1a;本文探讨了完善适配视频号交易小程序的重要意义&#xff0c;重点阐述了开源 AI 智能名片 S2B2C 商城小程序在这一过程中的应用。通过分析其与直播间和社群的无缝衔接特点&#xff0c;以及满足新流量结构下基础设施需求的能力&#xff0c;为门店在视频号直播交易…

【OH】openHarmony开发环境搭建(基于windows子系统WSL)

前言 本文主要介绍基于windows子系统WSL搭建openHarmony开发环境。 WSL与Vmware虚拟机的区别&#xff0c;可以查看WSL与虚拟机的区别 更详细的安装配置过程可参考微软官网&#xff1a; ​安装 WSL 前提 以下基于windows 111专业版进行配置&#xff0c;windows 10应该也是可以…

WPF使用Prism框架首页界面

1. 首先确保已经下载了NuGet包MaterialDesignThemes 2.我们通过包的项目URL可以跳转到Github上查看源码 3.找到首页所在的代码位置 4.将代码复制下来&#xff0c;删除掉自己不需要的东西&#xff0c;最终如下 <materialDesign:DialogHostDialogTheme"Inherit"Ide…

AHB Matrix 四星级 验证笔记(2.4) Tt3.3AHB总线协议测试时的 并行数据

文章目录 前言一、代码二、错误1.地址范围2. 并行执行线程中变量覆盖的情况3.有关incr的beat 前言 来源路科验证本节搞定 T3.3 AHB总线协议的覆盖&#xff1a;AHB_PROTOCOL_COVER 即测试ahb slave接口和master接口支持&#xff08;尽可能&#xff09;全部的ahb协议传输场景&am…

C++builder中的人工智能(16):神经网络中的SoftPlus激活函数

现在我们继续探索一下SoftPlus激活函数在人工神经网络&#xff08;ANN&#xff09;中的应用。了解SoftPlus激活函数的工作原理&#xff0c;将有助于您在使用C IDE构建C应用程序时更加得心应手。 目录 神经网络中的激活函数是什么&#xff1f;能在C中创建激活函数吗&#xff1f…

Java的(.properties后缀)的配置文件介绍与读取(3种情况)

目录 一、&#xff08;.properties后缀&#xff09;的配置文件。 &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;基本语法。 1、键值对。 2、如何注释&#xff1f; 3、编码类型。 4、空白字符。 5、多行值。 &#xff08;3&#xff09;".properties后缀&…

yaml文件编写

Kubernetes 支持YAML和JSON格式管理资源 JSON 格式:主要用于 api 接口之间消息的传递 YAML 格式;用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化容易读懂 一&#xff0c;yaml语法格式 1.1 基本语法规则 使用空格进行缩进&#xff08;不使用制表符&#xff0…

Node.js——fs模块-文件删除

1、在Node.js中&#xff0c;我们可以使用unlink或unlinkSync来删除文件。 2、语法&#xff1a; fs.unlink(path,callback) fs.unlinkSync(path) 参数说明&#xff1a; path 文件路径 callback 操作后的回调函数 本文的分享到此结束&#xff0c;欢迎大家评论区一同讨论学…

新版IJidea 如何打开数据库窗口(2024.2.4 版)(连接数据库)

新版IJidea 2024.2.4 如何打开数据库窗口&#xff1f; 方式&#xff1a;使用插件&#xff0c;Database Navigator 1.安装插件&#xff0c;步骤如下&#xff1a; 打开 Settings/Preferences 对话框&#xff08;快捷键 CtrlAltS&#xff09;。前往 Plugins 菜单项。在搜索框中…

黄仁勋:AI数据中心可扩展至百万芯片 性能年翻倍,能耗年减2-3倍

本周&#xff0c;英伟达CEO黄仁勋接受了《No Priors》节目主持人的采访&#xff0c;就英伟达的十年赌注、x.AI超级集群的快速发展、NVLink技术创新等AI相关话题进行了一场深度对话。黄仁勋表示&#xff0c;没有任何物理定律可以阻止将AI数据中心扩展到一百万个芯片&#xff0c;…

java 面向对象高级

1.final关键字 class Demo{public static void main(String[] args) {final int[] anew int[]{1,2,3};// anew int[]{4,5,6}; 报错a[0]5;//可以&#xff0c;解释了final修饰引用性变量&#xff0c;变量存储的地址不能被改变&#xff0c;但地址所指向的对象的内容可以改变} }什…

Codeforces Round 984 (Div. 3)

题目链接 A. Quintomania 题意 思路 模拟即可 示例代码 void solve() {int n;cin >> n;vector<int>arr(n);fer(i, 0 ,n) cin >> arr[i];fer(i, 1, n){if(abs(arr[i] - arr[i - 1]) ! 5 && abs(arr[i] - arr[i - 1]) ! 7){cout << "N…

基于BILSTM及其他RNN序列模型的人名分类器

数据集Kaggle链接 NameNationalLanguage | Kaggle 数据集分布: 第一列为人名,第二列为国家标签 代码开源地址 Kaggle代码链接 https://www.kaggle.com/code/houjijin/name-nationality-classification Gitee码云链接 人名国籍分类 Name Nation classification: using BI…