Leetcode-754. 到达终点数字

链接

754. 到达终点数字

题目

在一根无限长的数轴上,你站在0的位置。终点在target的位置。

你可以做一些数量的移动 numMoves :

每次你可以选择向左或向右移动。
第 i 次移动(从  i == 1 开始,到 i == numMoves ),在选择的方向上走 i 步。
给定整数 target ,返回 到达目标所需的 最小 移动次数(即最小 numMoves ) 。

示例

示例 1:
输入: target = 2
输出: 3
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 -1 。
第三次移动,从 -1 到 2 。

示例 2:
输入: target = 3
输出: 2
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 3 。

说明

  • -10e9 <= target <= 10e9
  • target != 0

思路

  • 1. 题目可以转化为 1 ± 2 ± 3 ...... ± k,确定每个数字前面的符号,使得总和为target且k最小
  • 2. 这里如果target为负数,可以转成其相反数,相当于-(1 ± 2 ± 3 ...... ± k),所有符号都变号,不影响最终结果。
  • 3. 设所有正数的和为N,负数的和为-P,则有N+P=S,N-P=target
  • 4. 两式相减可得,2P=S-target,这里P可以为任意数,S=(k*(k+1))/2,S-target为偶数
  • 5. 因此,这题就变成了找最小的k,使得S-target为偶数,这里S-target还得是正的。

C++ Code

class Solution{
public:
    int reachNumber(int target){
        if(target<0) target=-target;        
        int k=1;
        while(true)
        {
            int S=(k+1)*k/2;
            if(S-target>=0&&(S-target)%2==0) return k;
            k++;
        }
        return 0;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值