题目描述(中等难度)
原题链接
数据范围:
算法
(贪心)
- 逆序思维,题目等价于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次操作数即可
时间复杂度是 :最坏情况Y很多,X很小,Y不断除以2,空间复杂度是
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;
}
};
写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)