991. Broken Calculator
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^91 <= Y <= 10^9
Approach #1: Math. [Java]
class Solution {
public int brokenCalc(int x, int y) {
int count = 0;
while (y != x) {
if (x > y) return x - y + count;
if (y % 2 != 0) y += 1;
else y /= 2;
count++;
}
return count;
}
}
Analysis:
First, let us see if the solution exists or not.
Clearly, we can keep doubling x till it goes beyond y. Then we can keep decreamenting x till it reaches y. Since the number of operations is not limited, so we conclude that a solution exists.
So now, consider an optimal solution (any solution with the minimal number of steps).
The path is nothing but a sequence of numbers that start at x and end at y.
Assume (x <= y). The other case is trivial
Case 1) Y is odd
Now, consider the last second element of the sequence (optimal path). Recall that we can only move in the sequence via the allowed moves (in the forward direction, we multiply by 2 or decreament by 1). Let us back track and see which move did we actually use to get to y. (obviously it has to be one of the two moves).
Now, the move could not have been multiplication by 2, or else y would have been a multiple of 2, which violates our assumption. So the only possible move is the decrement move. It means that the last second term of the sequence is indeed y + 1 if y is odd. (And there is no other possibility).
So now we just need to compute the optimal length to reach y + 1, and then add 1 to our answer to get the optimal path length for y. (Why? It happens because y + 1 lies in an optimal path and any subpath of the optimal path must be optimal or else it would violates our assumptions).
Case 2) Y is even. Say, y = 2m
First, let us sudy the worst case analysis of what is the maximum number that you would touch if you play optimally.
Clearly it is 2 * (y - 1), since in the worst case, you may end up starting at y - 1 and jumping to 2 * (y - 1) and then coming back. In all other cases, the jump will lead you to a number less than 2 * (y - 1) and you can easily come back to y one step at a time.
Let us denote 2 * ( y - 1 ) as jump_max.
Now, if y is even, we cannot say anything about the last second term of the sequence. (The move could be either multiplication or decrement).
However, let us see what happens if the last move was multiplication by 2.
Clearly, the last second element in this case is y / 2 = m
So we need to compute the optimal path length to reach m and then we can add 1 to our answer. (But this is valid only if we know that the last move was indeed multiplication.)
what if the last move was decrement?
In that case, the last second element become 2m + 1, (odd number), and by the 1st lemma, we conclude that the last thrid number is 2m + 2.
Now 2m + 2 is an even number so either a jump happens or it's descendant is 2m + 4. So we keep going to the rigth untill we find ak such that 2m + 2k is obtained be jumping from m+k. Clearly such a number exists as the largest number we can encounter is jump_max.
So, now the path looks like:
x .......(m + k) -> 2 (m + k) -> (2m + 2k - 2) -> ...... y
But, if you observe carefully, after we reach (m + k) we can decrement k times to reach m and then double to get y. This would cost us (k+1) operations + the cost to reach (m + k). However, the current cost is (1 + 2 (m + k) - 2m) = (2k + 1) operations + the cost to reach (m+k). Since the new cost is lower, this violates our assumption that the original sequence was an optimal path. Therefore we have a contradiction and we conclude that the last move could not have been decrement.
Conclusion:
If y is odd, we know that the last number to be reached before y is (y + 1) (in the optimal path)
If y is even, we know that the last number to be reached before y is y / 2 (in the optimal path)
So finally we have recursive relation.
if (x >= y)
cost(x, y) = x - y
if (x < y)
cost(x, y) = 1 + cost(x, y+ 1) if y is odd
cost(x, y) = 1 + cost(x, y / 2) if y is even
This analysis may be easy to understand:
Trying to prove that if Y is even, the last operation must be doubling:
hypothesis: there can be one or more decrement from Y + 1 to Y in the shortest path, where last bit of Y is 0
since last bit of Y + 1 is 1, it must be decrement from Y + 2 (doubling can never make an 1 on last bit)
two options at Y + 2:
decrement from Y + 3, it's the same as the starting point Y + 1 and Y:
doubling from (Y+2)/2 three moves used from (Y+2)/2 to Y: double to Y + 2, decrement to Y+1, decrement to Y, while there is a shorter path: decrement to Y / 2, double to Y.
there we get a contradiction to the hypothesis
so the hypothesis is false
hence, there can be none decrement move(s) from Y + 1 to Y in the shortest path is last bit of Y is 0.
Reference:
991. Broken Calculator的更多相关文章
- LC 991. Broken Calculator
On a broken calculator that has a number showing on its display, we can perform two operations: Doub ...
- 【leetcode】991. Broken Calculator
题目如下: On a broken calculator that has a number showing on its display, we can perform two operations ...
- 【LeetCode】991. Broken Calculator 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- [Swift]LeetCode991. 坏了的计算器 | Broken Calculator
On a broken calculator that has a number showing on its display, we can perform two operations: Doub ...
- 123th LeetCode Weekly Contest Broken Calculator
On a broken calculator that has a number showing on its display, we can perform two operations: Doub ...
- A Broken Calculator 最详细的解题报告
题目来源:A Broken Calculator 题目如下(链接有可能无法访问): A Broken Calculator Time limit : 2sec / Stack limit : 256M ...
- 【LeetCode】Broken Calculator(坏了的计算器)
这道题是LeetCode里的第991道题. 题目描述: 在显示着数字的坏计算器上,我们可以执行以下两种操作: 双倍(Double):将显示屏上的数字乘 2: 递减(Decrement):将显示屏上的数 ...
- 算法与数据结构基础 - 贪心(Greedy)
贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
随机推荐
- MySQL深入研究--学习总结(1)
前言 本文是笔者学习"林晓斌"老师的<MySQL实战45讲>过程中的,对知识点的总结归纳以及对问题的思考记录,课程18年11月就出了,当时连载形式,我就上班途中一边开车 ...
- WEB容器开启、关闭OPTIONS方法
发现 请求包随意,响应包信息如下: HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 Vary ...
- 聊聊Dotnet的垃圾回收
最近在做一个项目,用到了大量的非托管技术,所以垃圾回收变得很重要. 在说垃圾回收之前,先说说两个概念: 托管代码,是由CLR管理的代码 非托管代码,是由操作系统直接执行的代码 在早期C++的时候, ...
- POJ-2349(kruskal算法+最小生成树中最大边的长度)
Arctic POJ-2349 这题是最小生成树的变形题目.题目的意思是已经有s个卫星频道,这几个卫星频道可以构成一部分的网络,而且不用费用,剩下的需要靠d的卫星接收器.题目要求的就是最小生成树中,最 ...
- web图像化服务管理工具
在 CentOS 8 中安装 Cockpit Web 控制台 Cockpit 是红帽开发的网页版图像化服务管理工具,优点是无需中间层,且可以管理多种服务. 根据其项目主站描述,Cockpit 有如下特 ...
- hibernate中关系映射的配置问题
部门和员工属于一对多的关系 员工的账户属于一对一关系 账户和权限属于多对多关系 department.hbm.xml 1 <hibernate-mapping> 2 <class n ...
- Selenium 4.0beta:读源码学习新功能
Selenium 4 源码分析 这一篇文章我们来分析Selenium 4 python版源码. 除非你对Selenium 3的源码烂熟于心,否则通过对比工具分析更容易看出Selenium 4更新了哪些 ...
- canvas-修改图片亮度
canvas操作-修改图片亮度 目录 canvas操作-修改图片亮度 图片亮度的概念 下面用ps截图举一个例子: 调整图片亮度的方案 实现方案一 从RGB到HSV的转换 转换的公式 javascrip ...
- 攻防世界 reverse 2ex1
2ex1 CISCN-2018-Quals mark 1 import base64 2 3 std_base= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijk ...
- Redis持久化——内存快照(RDB)
最新:Redis持久化--如何选择合适的持久化方式 最新:Redis持久化--AOF日志 最新:Redis持久化--内存快照(RDB) 一文回顾Redis五大对象(数据类型) Redis对象--有序集 ...