优选算法——双指针专题 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;
    }
};
相关推荐
木子算法10 分钟前
非凸、离散、还耦合:论文里的求解方法是一条四步流水线
人工智能·算法·目标跟踪
虚无的纽扣13 分钟前
【力扣刷题】第二天:无重复字符的最长字串、移动零问题
算法·leetcode·排序算法
多弗朗皮卡丘15 分钟前
数据结构9:排序算法
c语言·数据结构·排序算法
张祥64228890428 分钟前
牛顿迭代法求解开普勒方程:从RTKLIB源码到数值分析
人工智能·算法·机器学习
Niuguangshuo29 分钟前
论文解读:Deep Speech 2,工业级英中端到端 ASR 系统报告
算法·音视频·语音识别
nvvas36 分钟前
Java 入门(四):数组——数据的集合管理
java·开发语言
钓鱼的肝39 分钟前
csp-j-s总结(2)
c++·经验分享·笔记·算法·青少年编程
奇妙之二进制1 小时前
机器人导航路径规划算法入门(6)Dijkstra(迪杰斯特拉)算法深入解析
算法·导航
重生的黑客1 小时前
Qt 常用控件精讲(1):QWidget 核心属性全解 —— 从 geometry 到 qrc 与 QSS
c++·qt·qwidget·qss·常用控件
Hespethorn1 小时前
取 `X-Forwarded-For` 首段做频控 key,等于把限流开关交给了调用方
c++