LeetCode 题解 | 991. 坏了的计算器(逆序思维+贪心 C++)

题目描述(中等难度)

原题链接
在这里插入图片描述
数据范围:
1 < = X < = 1 0 9 1 <= X <= 10^9
1 < = Y < = 1 0 9 1 <= Y <= 10^9

算法

(贪心) O ( l o g n ) O(logn)

  • 逆序思维,题目等价于Y(偶数)除以2,或Y加一,最终得到X的最小操作数
  • 如果X >= Y,直接返回X - Y,因为Y一定是不断+1
  • 下面讨论X < Y时
  • 当Y是偶数时,Y一定会在某一次操作除以2,否则Y不断+1,永远不可能到X,然后我们证明这次操作一定是最先进行的
    证明:Y / 2 + 1 = (Y + 1 + 1) / 2 左边是在第一次操作除以2,右边是在第三次操作除以2,显然左边操作次数更少(2<3),如果Y先加4次1,那(Y + 1 + 1 +1 + 1) / 2 = Y / 2 + 1 + 1(5 > 3),所以Y先加2k次1再除以2,操作数一定比先除以2再加k次1要多,因此Y是偶数时一定要先除以2
  • 当Y是奇数时,Y先加1(奇数怎么除2呢),然后Y + 1是偶数了,根据上一条必须要除以2
  • 这样不断执行,直到X >= Y了,再加上X-Y次操作数即可

时间复杂度是 O ( l o g n ) O(logn) :最坏情况Y很多,X很小,Y不断除以2,空间复杂度是 O ( 1 ) O(1)

C++代码

class Solution {
public:
    // 逆向思维 Y->X  贪心
    // 等式 Y/2 + 1 = (Y + 1 + 1) / 2
    // 偶数:Y / 2
    // 奇数:Y + 1  
    
    int brokenCalc(int X, int Y) {
        int ans = 0;
        while(X < Y) {
            ans ++;
            if (Y & 1) Y ++;
            else Y /= 2;
        }
        return ans + X - Y;

    }
};

写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)

发布了239 篇原创文章 · 获赞 80 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_43827595/article/details/104289514