在一根無限長的數軸上,你站在0
的位置。終點在target
的位置。
每次你可以選擇向左或向右移動。第 n 次移動(從 1 開始),可以走 n 步。
返回到達終點需要的最小移動次數。
示例 1:
輸入: target = 3
輸出: 2
解釋:第一次移動,從 0 到 1 。
第二次移動,從 1 到 3 。
示例 2:
輸入: target = 2
輸出: 3
解釋:第一次移動,從 0 到 1 。
第二次移動,從 1 到 -1 。
第三次移動,從 -1 到 2 。
注意:
這題我一開始的想法是用二叉樹儲存每一次的的結果,但是在思考之後發現完全不可行!太複雜了,於是借鑑了他人的思想。
因為數軸具有對稱性,因此target的正負與最後的結果無關,因此輸入的target都可以轉化成正值。
在極端情況下,如果一直往右走那麼最後走最後的長度是sum = n * (n + 1) / 2,target一定小於或等於這個值。
用反證法可得n < (sum - target) / 2
當(sum - target) % 2 == 0時
一定可以在1到n中找到乙個數等於(sum - target) / 2
(1 + 2 + 3 + ... + n) - (1 + 2 + 3 + ... - (sum - target) / 2 + ... + n) = sum - target
1 + 2 + 3 + ... - (sum - target) / 2 + ... + n = sum - (sum - target) = target
即移動次數為n
當(sum - target) % 2 != 0時
若n為偶數
則有(1 + 2 + 3 + ... - (sum - target + 1) / 2 + ... - n / 2 ...+ ... + n + 1) = sum + n + 1 - (sum - target + 1) - n = target
即移動次數為n + 1
若n為奇數
則有(1 + 2 + 3 + ... - (sum - target + 1) / 2 + ... + ... - (n + 1) + n + 2) =sum - (n + 1) - (sum - target + 1) + n + 2 = target
即移動次數為n + 2
class solution
int i = 0;
while(i * (i + 1 ) / 2 < target)
if(i * (i + 1 ) / 2 == target)
else
else
else}}
}
LeetCode754 到達終點數字
在一根無限長的數軸上,你站在0的位置。終點在target的位置。每次你可以選擇向左或向右移動。第 n 次移動 從 1 開始 可以走 n 步。返回到達終點需要的最小移動次數。示例 1 輸入 target 3 輸出 2 解釋 第一次移動,從 0 到 1 第二次移動,從 1 到 3 示例 2 輸入 tar...
leetcode 754 到達終點數字
題目 在一根無限長的數軸上,你站在0的位置。終點在target的位置。每次你可以選擇向左或向右移動。第 n 次移動 從 1 開始 可以走 n 步。返回到達終點需要的最小移動次數 class solution return i 1 target的正負與答案無關,故取正,假設前n步均向右走,如果恰好得到...
Leetcode 754 到達終點數字 C
在一根無限長的數軸上,你站在0的位置。終點在target的位置。每次你可以選擇向左或向右移動。第 n 次移動 從 1 開始 可以走 n 步。返回到達終點需要的最小移動次數。示例 1 輸入 target 3 輸出 2 解釋 第一次移動,從 0 到 1 第二次移動,從 1 到 3 示例 2 輸入 tar...