leetcode 754. 到達終點數字

在一根無限長的數軸上,你站在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都可以轉化成正值。

在極端情況下,如果一直往右走那麼最後走最後的長度是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 {
    public int reachNumber(int target) {
        if(target < 0){
            target = -target;
        }   
        int i = 0;
        while(i * (i + 1 ) / 2 < target){
            i += 1;
        }
        if(i * (i + 1 ) / 2 == target){
            return i;
        }
        else{
            if((i * (i + 1 ) / 2 - target) % 2 == 0){
                return i;
            }
            else{
                if(i % 2 == 0){
                    return i + 1;
                }
                else{
                    return i + 2;
                }
            }
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章