优选算法——双指针专题 3.快乐数 4.盛水最多的容器

优选算法------双指针专题 3.快乐数 4.盛水最多的容器

一.快乐数

1.题目解析

题目传送门(202. 快乐数 - 力扣(LeetCode))

2.原理解析

第一种情况:数最后变成1

第二种情况:无限循环但不是1

但两种都可以抽象成一种,有点像之前做过的带环链表

解法:快慢双指针

1.定义快慢指针

2.慢指针每次向后移动一步,快指针每次向后移动两步

3.判断相遇时候的值

3.代码实现

cpp 复制代码
class Solution {
public:

    int BitSum(int n)//返回每一位数上的平方和
    {
        int sum=0;
        while(n)
        {
            int m=n%10;
            sum+=m*m;
            n=n/10;
        }
        return sum;
    }
    bool isHappy(int n) {
        int slow=n,fast=BitSum(n);
        while(slow!=fast)
        {
            slow=BitSum(slow);
            fast=BitSum(BitSum(fast));
        }

        return slow==1;

    }
};

二.盛水最多的容器

题目传送门(11. 盛最多水的容器 - 力扣(LeetCode))

1.题目解析

2.原理解析

解法一:暴力枚举

时间复杂度O(N^2) 会超时

解法二:利用单调性,使用双指针

在这一组数中拿出一个区间 6,2,5,4

我们先用最两边的数算一个容积,然后小的那个固定住(也就是4) ,向内枚举

如果遇到比它小的数(也就是2),高度跟宽度都减小,v减小

如果遇到比它大的数(也就是5),高度不变(还是4),宽度减小,v减小

所以我们可以直接舍去小的那一个,在研究下一个区间

3.代码实现

cpp 复制代码
class Solution {
public:
    int maxArea(vector<int>& height) {
        int left=0,right=height.size()-1,ret=0;
        while(left!=right)
        {
            int v=min(height[left],height[right])*(right-left);
            ret=max(ret,v);
            if(height[left]<height[right]) left++;
            else right--;
        }
        return ret;
    }
};
相关推荐
写后端的胖头鱼11 小时前
一文详解B+树原理(附场景+示例)
数据结构·b树
怕浪猫12 小时前
RAG 面试 6 连问,从原理到优化全部覆盖
python·算法·面试
无线通信科研笔记13 小时前
IEEE TVT 2026 论文精读与完整复现|相位误差如何重塑近场 RIS 的幅相响应
论文阅读·人工智能·python·算法·论文笔记
2601_9628857213 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
mmmmath_313 小时前
二叉树の递归遍历
算法
爱吃奥利奥_wen14 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
All for pursuit.14 小时前
【位运算-1】338.比特位计数
数据结构·c++·算法·leetcode
我可能是个假开发14 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
小师兄吃牛肉14 小时前
C语言中的nullptr有必要吗
c语言·c++·算法
WL学习笔记15 小时前
日期类(C++)
开发语言·c++·日期类实现