Using Greedy Algorithm to Fix the Broken Calculator

  • 时间:2020-09-21 09:15:21
  • 分类:网络文摘
  • 阅读:128 次

On a broken calculator that has a number showing on its display, we can perform two operations:

  • Double: Multiply the number on the display by 2, or;
  • Decrement: Subtract 1 from the number on the display.

Initially, the calculator is displaying the number X. Return the minimum number of operations needed to display the number Y.

Example 1:
Input: X = 2, Y = 3
Output: 2
Explanation: Use double operation and then decrement operation {2 -> 4 -> 3}.

Example 2:
Input: X = 5, Y = 8
Output: 2
Explanation: Use decrement and then double {5 -> 4 -> 8}.

Example 3:
Input: X = 3, Y = 10
Output: 3
Explanation: Use double, decrement and double {3 -> 6 -> 5 -> 10}.

Example 4:
Input: X = 1024, Y = 1
Output: 1023
Explanation: Use decrement operations 1023 times.

Note:
1 <= X <= 10^9
1 <= Y <= 10^9

Greedy Algorithm Fixes the Broken Calculator

A greedy algorithm has a strategy that picks the current optimial solution which will lead to a global optimial solution. But it does not work for all types of problems e.g. Dynamic Programming.

For simplicity, we can look into the problem slightly in a different way. We can transform Y to X, thus only two operations are allows: divided number by two (if it is an even number), and add one to the number.

Dividing by two (if it is an even number) is obviously better (shorter) than do minus, minus, divide, plus, plus. If it is odd number, it seems that we can only increment this number by one.

If Y is smaller than X, then, the greedy approach requires (X – Y) steps. The worst case scenario complexity is O(Max(1, X – Y)).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
    int brokenCalc(int X, int Y) {
        int ans = 0;
        while (X < Y) {
            if (Y % 2 == 0) {
                Y /= 2;
            } else {
                Y ++;
            }
            ans ++;
        }
        return ans + X - Y;
    }
};
class Solution {
public:
    int brokenCalc(int X, int Y) {
        int ans = 0;
        while (X < Y) {
            if (Y % 2 == 0) {
                Y /= 2;
            } else {
                Y ++;
            }
            ans ++;
        }
        return ans + X - Y;
    }
};

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
四种热门食物并没有那么神奇的营养功效  “养胃饼干”不养胃 消费者起诉徐静蕾代言  盛夏常饮枸杞菊花茶 保养眼睛功效强  西瓜虽好,但这九类人群不宜吃西瓜  保健酒乱象调查:为见效快违法添加伟哥  饮用蜂蜜水的最佳时间及注意事项  红枣维生素含量高 喝大枣水养肝排毒  黑木耳营养丰富对健康有五大好处  香蕉和橘子能起到解毒护肝的作用  吃葡萄、喝葡萄酒能帮助调节性功能 
评论列表
添加评论