【leetcode刷题】T212-到达终点数字
- 2019 年 12 月 23 日
- 筆記
木又连续日更第88天(88/100)
木又的第212篇leetcode解题报告
数学
类型第28篇解题报告
leetcode第754题:到达终点数字
https://leetcode-cn.com/problems/reach-a-number/
【题目】
在一根无限长的数轴上,你站在0的位置。终点在target的位置。
每次你可以选择向左或向右移动。第 n 次移动(从 1 开始),可以走 n 步。
返回到达终点需要的最小移动次数。
示例 1: 输入: target = 3 输出: 2 解释: 第一次移动,从 0 到 1 。 第二次移动,从 1 到 3 。 示例 2: 输入: target = 2 输出: 3 解释: 第一次移动,从 0 到 1 。 第二次移动,从 1 到 -1 。 第三次移动,从 -1 到 2 。
注意:
target是在[-10^9, 10^9]范围中的非零整数。
【思路】
首先,target是正数还是负数,所需要的最小步数是一样的,因此可以先将target取绝对值。
其次,我们可以先假设全向右移动,一步一步移动,即求1+2+…+n的和sum0=n * (n+1) / 2,如果sum0小于target,则再移动一次,再进行判断;否则,如果(sum0 – target) % 2 != 0,同样再移动一次;如果(sum0 – target) % 2 == 0, 那么(sum – target) / 2这一步改为向左移动,这样sum0刚好为target。
最后,有一个小trick,可以先求sqrt(target),找到初始的n值,大量节省遍历时间。
【代码】
python版本
class Solution(object): def reachNumber(self, target): """ :type target: int :rtype: int """ target = abs(target) n = int(math.sqrt(target)) diff = n * (n + 1) / 2 - target while diff < 0 or diff % 2 != 0: n += 1 diff += n return n
C++版本
class Solution { public: int reachNumber(int target) { target = abs(target); int n = (int)sqrt(target); int diff = n * (n + 1) / 2 - target; while(diff < 0 || diff % 2 != 0){ n++; diff += n; } return n; } };