【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; } };

