跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C算法

双指针算法实战:快乐数与盛最多水的容器

综述由AI生成双指针算法在快乐数与盛最多水的容器中应用。快乐数通过快慢指针检测循环,利用鸽巢原理判断是否收敛于 1;盛最多水的容器使用左右双指针向中间移动,根据高度较小的一侧移动以寻找最大容积。代码分别展示了 C 语言实现逻辑,包含数字平方和计算及面积最大值更新过程。

RustyLab发布于 2026/2/6更新于 2026/6/319 浏览
双指针算法实战:快乐数与盛最多水的容器

一、快乐数

题目描述

文章配图

原理解析

这道题的意思是如果某个数能够按照规则进行变化,最后得到 1,那这个数就是快乐数。判断步骤如下:

  1. 将这个数字拆分。
  2. 将这个数字的每一位数字进行平方操作,再相加。
  3. 经过多次循环后,看看整个数是不是等于 1。

以数字 2 为例推导:

文章配图

由此可见,数字 2 最后回不到 1,所以它不是快乐数字。

这道题有三种情况:

文章配图

如果不循环进行下去,如何判断会不会等于 1?这里涉及到鸽巢原理。

鸽巢原理

定义:假设有 n 个'物品',要放进 m 个'抽屉'里;如果物品数 n > 抽屉数 m,那么至少有一个抽屉里会装着至少 2 个物品。

在这道题目中,计算数字各位的平方和。数据范围是 1~21 亿,最大的数 9999999999 的各位平方和为 810。因此,21 亿范围内的数的各位平方和一定小于 810,范围是【1,810】。这个数字范围就是抽屉,整个 21 亿范围内的数字的各位平方和就是苹果。根据鸽巢原理,这些数字不论怎么变化,最后肯定会和其中某一个数字相同。所以我们最后只用判断在循环出现的数字中有没有 1 这个数字就可以了。

我们可以使用快慢指针的方式遍历一遍所有可能生成的数字,如果慢指针与快指针相等同时等于 1,那么这个数就是快乐数字,如果不等于 1,那就不是快乐数字。

代码实现

// 想要实现这个操作,还要再写一个操作函数
int Func(int num) {
    int sum = 0;
    while(num != 0) {
        int temp = num % 10;
        sum += temp * temp;
        num /= 10;
    }
    return sum;
}

bool isHappy(int n) {
    
    
     slow = n;
    
     fast = Func(n); 
    
    (slow != fast) {
        slow = Func(slow);
        fast = Func(Func(fast));
    }
     slow == ;
}
// 这道题可以使用快慢指针来解决
// 先定义一个慢指针
int
// 再定义一个快指针
int
// 因为慢指针走一步,快指针走两步
// 现在进入循环,知道这两个相等为止
while
return
1

二、盛最多水的容器

题目描述

文章配图

原理解析

这道题的意思很明了,就是想让我们将容积最大的数字计算出来,实际上就是让我们找到 x 与 y 乘积的最大值。这里的乘法遵循木桶效应,两个数相乘。

容器的体积 = distance(两数之间的距离) * height(两数之间小的那个数字)

这里我们同样可以使用双指针,将两个指针分别放在数组的左右两侧,先计算本次的容积,再判断两个指针所指向的数字(一下简称左右指针)哪个小。如果是左指针小,那就将左指针向右移动一位,反之就是右指针向左移动。

为什么呢?因为左指针在移动的过程中,他与右指针的距离 distance 在缩小,如果高度 height 不变,那整个容积仍然是减小的,如果高度 height 还减小,那整个体积会更加小,所以我们会尽全力的争取高度最大,因为 distance 是肯定会减小的。

最后在计算的过程中,只用再加上一个变量 maxV 用来记录当前容积的最大值即可。

代码实现

int maxArea(int* height, int heightSize) {
    int left = 0;
    int right = heightSize - 1;
    int maxV = 0;
    int volume = 0;
    while(left < right) {
        volume = (right - left) * (height[left] > height[right] ? height[right] : height[left]);
        if(volume > maxV) {
            maxV = volume;
        }
        height[left] < height[right] ? left++ : right--;
    }
    return maxV;
}

以上就是我对这两道题的分享了。

目录

  1. 一、快乐数
  2. 题目描述
  3. 原理解析
  4. 鸽巢原理
  5. 代码实现
  6. 二、盛最多水的容器
  7. 题目描述
  8. 原理解析
  9. 代码实现
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Vue 组件枚举值验证实战:从 Type 属性错误说起
  • Linux 信号保存核心:未决信号集与阻塞信号集详解
  • Visual C++运行库修复指南:解决程序启动失败问题
  • Midjourney Imagine API 申请与使用指南
  • Windows Git 安装与配置实战指南
  • Rust 异步测试与调试实践指南
  • 与模型对话:理解与预防 ChatGPT 中的常见误解
  • 被工具定义的编程时代:VS Code、Copilot 与 JetBrains 效率指南
  • 多模态大模型:开启通用人工智能新篇章
  • 2026 主流免费 AI 写作工具测评与去 AI 味指南
  • Python 日志记录最佳实践与高级配置指南
  • AI 写作中参考文献幻觉现象分析与规避策略
  • 动态规划:最长递增子序列变体解析
  • 阿里开源 Page-Agent:一行 JS 代码实现大模型寄生前端 DOM
  • 前端通用 AI Rules 定义,适用于 Cursor 等主流 AI 开发工具
  • 大模型深度解析:定义、架构与伦理挑战
  • VR 大空间项目内容规划与设计:2023-2026 市场实战复盘
  • GitHub Copilot 接入第三方模型 API 配置实战
  • C++ 插入排序算法原理与实现
  • JVM 调优实战:内存模型、GC 策略与工具使用

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online