• 双指针_快乐数


    快乐数

    题目链接:快乐数

    内容:

    思路1:

    对一个数不断执行这个过程,会有两个结果

    1.变为1

    2.不为1并无限循环。

    其实第一种情况也可以看成无限循环,只不过循环的这组数据全是1.

    而第二种情况 循环的这组数据的值每个都不一样,循环到起点值又会重新循环。

     

    所以我们用两个快慢指针,两指针相遇时退出循环,此时指针的值如果为1就是快乐数

    1.把这个过程用funct函数实现

    2.进行一次funct相当于移动到下一个值,slow是第一个值,fast第二个值。slow每次走一次,fast走两次,直到相遇。

    代码实现

    1. class Solution {
    2. public:
    3. int funct(int n)
    4. {
    5. int sum=0;
    6. while (n)
    7. {
    8. int i = n % 10;
    9. sum+=i*i;
    10. n /= 10;
    11. }
    12. return sum;
    13. }
    14. bool isHappy(int n)
    15. {
    16. int slow=n,fast=funct(n);
    17. while(slow!=fast)
    18. {
    19. slow=funct(slow);
    20. fast=funct(fast);
    21. fast=funct(fast);
    22. }
    23. return slow==1;
    24. }
    25. };

    思路2:

    题目中n的值最大为2^31-1也就是2,147,483,647 。在其范围的1,999,999,999经过funct后的值(sum)是最大的即730。

    也就是说经过731次循环还没结束的话就不是快乐数了。

    代码实现:

    1. class Solution {
    2. public:
    3. int funct(int n)
    4. {
    5. int sum=0;
    6. while (n)
    7. {
    8. int i = n % 10;
    9. sum+=i*i;
    10. n /= 10;
    11. }
    12. return sum;
    13. }
    14. bool isHappy(int n)
    15. {
    16. int count=731;
    17. while (count--)
    18. {
    19. n=funct(n);
    20. if(n==1)return true;
    21. }
    22. return false;
    23. }
    24. };

    盛最多水的容器

    思路:

    首先我们通过暴力求解的方式算每两个元素间的体积,这种做法时间复杂度O(n^2),在这道题是不行的。

    所有我们要找到其中的数学规律才行。

    想一下任意两个元素之间的体积V1,如果里面存在更大的V2,那V2盛水的高度要更高。

    水的高度取决于较小的值,更改较小的值找比它大的值代替。每更改一次就计算一次体积。

     

    那么怎么样才能不漏掉任意一种情况呢?
    1.先创建两个指针left指向第一个元素,right指向最后一个元素,并算出体积V

    2.更换较小的值。如果nums[left] < nums[right] ,left++直到找到比它大的值。找到后计算体积并与V比较,大于V就更换。反之right--

    3.当left>=right时结束。

    代码实现:

    1. class Solution {
    2. public:
    3. int maxArea(vector<int>& height) {
    4. int left=0,right=height.size()-1;
    5. int max=0;
    6. while(left<right)
    7. {
    8. int v=(right-left)*min(height[right],height[left]);
    9. max=max>v?max:v;
    10. if(height[right]<height[left])
    11. {
    12. int r=height[right];
    13. while(left<right&&height[right]<=r) right--;
    14. }
    15. else
    16. {
    17. int l=height[left];
    18. while(left<right&&height[left]<=l) left++;
    19. }
    20. }
    21. return max;
    22. }
    23. };

  • 相关阅读:
    树形结构之父子节点查询
    MVC第三波书店分页数据PageList工具类
    Android11适配
    语义图像合成在AI去衣技术中的应用
    【英语:基础进阶_听口实战运用】D5.听力对话训练
    jpcap 分支tcpdump抓包文件遇到的问题以及解决情况
    C#完成XML文档节点的自动计算功能
    std::unique_ptr、std::shared_ptr定制删除器
    CPU占用率过高排查
    windows平台下的mysql启动等基本操作
  • 原文地址:https://blog.csdn.net/wws7920/article/details/139359441