《算法题讲解指南:优选算法-双指针》--03快乐数,04盛水最多的容器

《算法题讲解指南:优选算法-双指针》--03快乐数,04盛水最多的容器

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

03.快乐数

题目链接:

题目描述:

题目示例:

题目分析:

算法思路:

C++代码演示:

算法总结及流程解析:

04.盛水最多的容器

题目链接:

题目描述:

题目示例:

算法思路:

C++代码演示:

算法总结及流程解析:

结束语


03.快乐数

题目链接:

202. 快乐数 - 力扣(LeetCode)

题目描述:

题目示例:

题目分析:

      为了方便叙述,将【对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和】这一个操作记为 x 操作;

      题目已经告诉我们,当我们不断重复 x 操作的时候,计算一定会【循环】,循环方式有两种:

  • 情况一:一直在 中进行循环,即 1 -> 1 -> 1- > 1……
  • 情况二:在历史的数据中进行循环,但始终变不到 

      由于上述两种情况只会出现一种,因此,只要我们能够确定循环时在【情况一】中进行,还是在【情况二】中进行,就能得到结果。

简单证明(为什么一定循环):

  • 经过依次变化之后的最大值 9^2*10=810 (2^31-1=2147483647。选一个更大的最大9999999999),也就是变化的区间在【1,810】之间;
  • 根据【鸽巢原理】,一个数变化 811 次之后,必然会形成一个循环;
  • 所以,变化的过程最终一定会走到一个圈里面,因此可以用【快慢指针】来解决。

解法:(快慢指针)

算法思路:

      根据上述的题目分析,我们可以知道,当重复执行 x 的时候,数据会陷入到一个【循环】之中。而【快慢指针】有一个特性,就是在一个圆圈里,快指针总是会追上慢指针的,也就是说他们总会相遇在一个位置上。如果相遇的位置的值是 1 ,那么这个数一定是快乐数;如果相遇的位置不是 1 的话,那么就不是快乐数。

C++代码演示:

class Solution { public: int sum(int n) { int sum = 0; int rem = 0; while(n) { rem = n % 10; n /= 10; sum += (rem * rem); } return sum; } bool isHappy(int n) { int slow = n; int fast = sum(n); //初始化让fast到第二个数 //因为两者一定会重合,所以如果同时初始化n则while进不去 while(slow != fast) { slow = sum(slow); // fast = sum(fast); // fast = sum(fast); fast = sum(sum(fast)); } // if(slow == 1) // { // return true; // } // return false; return slow == 1; } };

算法总结及流程解析:

04.盛水最多的容器

题目链接:

11. 盛最多水的容器 - 力扣(LeetCode)

题目描述:

题目示例:

算法思路:

 设两个指针 left right 分别指向容器的左右两个端点,此时容器的容积:

        v = (right - left)* min( height[ right ],height[ left ] )

      容器的左边界为 height[ left ],右边界为 height[ right ]。

      为了方便叙述,我们假设 【左边边界】小于 【右边边界】。

如果此时我们固定一个边界,改变另一个边界,水的容积会有如下变化形式:

  • 容器的宽度一定变小
  • 由于左边界较小,决定了水的高度。如果改变左边界,新的水面高度不确定,但是一定不会超过右边的柱子高度,因此容器的容积可能会增大。
  • 如果改变右边界,无论右边界移动到哪里,新的水面高度一定不会超过左边界,也就是不会超过现在的水面高度,但是由于容器的宽度减小,因此容器的容积是一定会变小的。

      由此可见,左边界和其余边界的组合情况都可以舍去。所以我们可以 left++ 跳过这个边界,继续去判断下一个右边界。(在本题里就是先比较左右谁小,如果左边小就left++,右边小就right--)

      当我们不断重复上述过程,每次都可以舍去大量不必要的枚举过程,直到 left  right 相遇。期间产生的所有的容积里面取最大值,就是最终答案。

C++代码演示:

class Solution { public: int maxArea(vector<int>& height) { int v_max = 0; int v = 0; int left = 0; int right = height.size() - 1; while(left < right) { int h_min = min(height[left], height[right]); v = (right - left) * h_min; if(h_min == height[left]) { left++; } else { right--; } if(v > v_max) { v_max = v; } } return v_max; } };

算法总结及流程解析:

结束语

      到此,03.快乐数和04.盛水最多的容器两道算法题就讲解完了。快乐数问题采用快慢指针法判断循环类型,盛水容器问题利用对撞指针优化计算。希望大家能有所收获!

Read more

HarmonyOS应用开发实战(基础篇)Day10 -《鸿蒙网络请求实战》

HarmonyOS应用开发实战(基础篇)Day10 -《鸿蒙网络请求实战》

鸿蒙网络请求实战 * 安装三方库 axios * 安装步骤 * 配置网络权限 * 网络请求测试 * 创建用户类(TypeScript 类型建模) * 测试代码实现 * 创建用户列表(完整交互版) * 页面部分代码解析 * 一、代码整体功能总结 * 二、逐部分详细解析 * 1. 依赖导入部分 * 2. 组件核心结构 * 3. 组件属性定义 * 4. 获取数据的核心方法 * 5. 自定义构建器(删除按钮) * 6. 页面 UI 构建(build 方法) * 三、代码运行流程 * 总结与延伸建议 * 核心技术栈 * 工程化建议 安装三方库 axios 在鸿蒙应用开发中,网络请求是连接前端与后端服务的核心能力。虽然系统提供了 @ohos.net.http 原生模块,但其 API

By Ne0inhk

rocky linux9.6英伟达显卡驱动安装

在 Rocky Linux 9.6 上安装英伟达显卡驱动,需根据显卡型号选择适配的驱动版本,并完成禁用开源驱动、安装依赖、加载专有驱动等操作。以下是详细步骤: 一、确认显卡型号与驱动兼容性 1. 安装依赖 dnf install -y wget vim tar telnet tmux pciutils epel-release 2. 查看显卡型号 lspci | grep -i nvidia 记录输出中的显卡型号(如  NVIDIA Corporation Device 2d04)。 3. 访问 NVIDIA 官网: * 官网地址:https://www.nvidia.com/Download/index.aspx * 选择显卡型号、

By Ne0inhk
2026最新|国内可用 Docker 镜像加速源大全(2月持续更新):DockerHub 镜像加速与限速避坑全指南(适配 Windows / macOS / Linux / containerd /

2026最新|国内可用 Docker 镜像加速源大全(2月持续更新):DockerHub 镜像加速与限速避坑全指南(适配 Windows / macOS / Linux / containerd /

2026最新|国内可用 Docker 镜像加速源大全(2月持续更新):DockerHub 镜像加速与限速避坑全指南(适配 Windows / macOS / Linux / containerd / k3s / BuildKit) 摘要:本指南面向国内服务器与办公网络用户,系统梳理 2026年2月可用 DockerHub 镜像加速源,覆盖 Docker Desktop、dockerd、containerd、k3s、BuildKit 等场景的一键配置、多源回退与测速排障方案,帮助规避 429/Too Many Requests 与拉取超时问题。 最后更新:2026-2 适用对象:国内云服务器/办公网络拉取 DockerHub 镜像慢、易触发限速(429/“Too Many Requests”)的场景 用途:一键配置镜像加速、

By Ne0inhk
【Linux系列】Linux 世界的通行证与守卫者:一文读懂权限的奥秘

【Linux系列】Linux 世界的通行证与守卫者:一文读懂权限的奥秘

🫧 励志不掉头发的内向程序员:个人主页  ✨️ 个人专栏: 《C++语言》《Linux学习》 🌅偶尔悲伤,偶尔被幸福所完善 👓️博主简介: 文章目录 * 前言 * 一、shell 命令以及运行原理 * 二、Linux 权限的概念 * 2.1、Linux 用户 * 2.2、Linux 权限管理 * 权限的理解 * 权限角色 * 普通文件访问权限的相关设置方法及讲解 * 目录文件 * 粘滞位 * 总结 前言 本章节我们来聊聊我们 Linux 系统中的权限问题,让我们明白 Linux 中的权限是什么,为什么要有权限,以及怎么操作我们的权限,我们一起来看看吧。 一、shell 命令以及运行原理 Linux 严格意义上说的是一个操作系统,我们称之为 “核心(kernel)“,但我们一般用户,

By Ne0inhk