LeetCode 754. 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 。  

解析

class Solution {
public:
    int reachNumber(int target) {
        // 理解這題的意思 這題就好做了
        // 分析 首先考慮一種比較極端的情況 即一直向正方向移動n步 ,剛好達到target 
        // 那么target的值就等於前n步的和 ,也就是1+2+.....+n = n*(n+1)/2
        // 如果n(n+1)/2>target ,那么所需要的步數肯定要比n多,而且肯定有向左走的步子,也就是求和的時候肯定是有負數的,至於哪個或者哪些個為負,下面開始討論
        //1,n(n+1)/2 - target 為偶數時,所以要想到達 target 需要向左走 n(n+1)/2 - target 偶數步 ,
        // 就是把前n項中第( n(n+1)/2 - target)/2 步變為負號就行了
        //當n(n+1)/2 - target 為奇數時,就要分類討論了,若n為奇數n+1就是偶數 無論向左還是向右 都不會產生一個奇數的差來因此需要再走一步故要n+2步
        //若n為偶數,n+1則為奇數,可以產生一個奇數的差,故要n+1步
        if(target<0) return reachNumber(-target) ;
        int i=0 ;          
        while(i*(i+1) < 2*target )
        {
            i++;
        }
 
        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 ;
            }
        }
        
    }
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM