【鼠鼠优选算法-双指针】003:快乐数 & 004:盛水最多的容器

🎈主页传送门****:良木生香

🔥个人专栏:《C语言》《数据结构-初阶》 《鼠鼠的算法之路》

🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离



目录

一、快乐数

题目描述:

原理解析:

鸽巢原理:

代码实现:

二、盛最多水的容器

题目描述:

原理解析:

代码实现:



今天我们来看两道有意思的题目,分别是力扣的11号和202号题目,题目链接2我会在讲到题目的时候放给大家

一、快乐数

这是题目链接:

202. 快乐数

题目描述:

原理解析:

这道题讲的是如果某个数能够按照他所给的规则进行变化,最后得到1,那这个数就是快乐数,意思很容易理解,那么下面我们来看看这道题该怎么实现算法吧~~

想要判断这个数是不是快乐数字,我们要做的是以下步骤:

1.将这个数字拆分

2.将这个数字的每一位数字进行平方操作,再相加

3.经过与偶先次循环后,看看整个数是不是等于1

现在我们对题目给出来的样例进行推导:

数字19题目已经帮我们推导过了,那现在我们自己来试试推导数字2:

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

讲到这里,我们就可以知道,这道题现在有三种情况:

那我们现在不妨想一想,这道题如果不循环的进行下去,我们该怎么判断会不会等于1呢?

那么在这道题目中,就涉及到一个小小定理,叫做鸽巢原理,下面我就详细讲讲这个原理:

鸽巢原理:

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

这样子讲可能不好理解,那我们讲个例子来体会体会:

由此可见,数字2最后并回不到1,所以它不是快乐数字,那我们不妨想一想,是不是每个数字最后都会循环到同一个数字上呢?即使不是它本身?

我们想要将三个苹果放进两个抽屉里面,那么肯定有一个抽屉放了两个苹果

那这个原理在这道题目里面有什么用呢?,抽屉是对应题目里面的什么?苹果对应的又是题目里的什么?

我们知道,这道题的过程是"计算数字各位的平方和",那么我们就可以计算一下,在2^10这些数字中,他们的各位平方和的范围是多少?现在题目给出了数据的范围:1~21亿, 想知道这些数字的运算范围,我们直接用上极限法,直接计算9999999999 这个数字的各位平方和,计算得到810,也就是说,这么大的一个数的各位平方和都只是810,那么在21亿这个数之内的数的各位平方和一定小于810,那么他们的范围就是**【1,810】,这时候就明了了,**这个数字范围就是抽屉,整个21亿范围内的数字的各位平方和就是苹果,那么根据鸽巢原理的定义,这些数字不论怎么变化,最后肯定会和其中某一个数字相同,所以我们最后只用判断在循环出现的数字中有没有1这个数字就可以了

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

代码实现:

cpp 复制代码
//想要实现这个操作,还要再写一个操作函数
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) {
    //这道题可以使用快慢指针来解决
    //先定义一个慢指针
    int slow = n;
    //再定义一个快指针
    int fast = Func(n);//因为慢指针走一步,快指针走两步

    //现在进入循环,知道这两个相等为止
    while(slow!=fast){
        slow = Func(slow);
        fast = Func(Func(fast));
    }
    return slow == 1;
}

二、盛最多水的容器

题目链接:

盛最多水的容器

题目描述:

原理解析:

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

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

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

为什么呢?

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

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

代码实现:

cpp 复制代码
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;

}

这道题拿督不大,整体给到NPC

以上就是我对这个两道题的分享了,感谢大佬们的阅读~~~~

相关推荐
Cx330❀2 小时前
【优选算法必刷100题】第41-42题(模拟):Z 字形变换,外观数列
c++·算法
沃尔特。2 小时前
直流无刷电机FOC控制算法
c语言·stm32·嵌入式硬件·算法
CW32生态社区2 小时前
CW32L012的PID温度控制——算法基础
单片机·嵌入式硬件·算法·pid·cw32
Cx330❀2 小时前
【优选算法必刷100题】第038题(位运算):消失的两个数字
开发语言·c++·算法·leetcode·面试
漫随流水2 小时前
leetcode回溯算法(93.复原IP地址)
数据结构·算法·leetcode·回溯算法
燃于AC之乐2 小时前
我的算法修炼之路--5——专破“思维陷阱”,那些让你拍案叫绝的非常规秒解
c++·算法·贪心算法·bfs·二分答案·扩展域并查集·动态规划(最长上升子序列)
艾莉丝努力练剑2 小时前
【优选算法必刷100题】第021~22题(二分查找算法):山脉数组的峰顶索引、寻找峰值
数据结构·c++·算法·leetcode·stl
艾莉丝努力练剑2 小时前
【优选算法必刷100题】第007~008题(双指针算法):三数之和、四数之和问题求解
linux·算法·双指针·优选算法
gihigo19984 小时前
希尔伯特-黄变换(HHT)完整MATLAB实现
人工智能·算法·matlab