题目地址:
https://leetcode.com/problems/broken-calculator/description/
给定两个正整数 x , y x,y x,y,每一步允许将 x x x乘以 2 2 2或者减 1 1 1,问至少多少步能变成 y y y。
相当于问从 y y y出发,每一步能除以 2 2 2或者加 1 1 1,至少多少步能变成 x x x。如果 x < y x<y x<y的话,那么一定要除以 2 2 2,而如果 x > y x>y x>y,则只能加 1 1 1,这样每一步操作都是确定的,直接模拟即可。代码如下:
class Solution {
public:
int brokenCalc(int x, int y) {
int res = 0;
while (y > x) {
y % 2 ? y++ : y >>= 1;
res++;
}
return res + x - y;
}
};
时间复杂度 O ( log ( y − x ) + x ) O(\log (y-x)+x) O(log(y−x)+x),空间 O ( 1 ) O(1) O(1)。