每日一题——到达终点数字

示例 1:

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

 
示例 2:

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

提示:

  • -109 <= target <= 109
  • target != 0

思路:

这是一个数学题,>_<...>_<...>_<...>_<... >_<... >_<

1.很明显对于target,正数和负数,结果都是一样的,这里只考虑正数。

2.要求的是最小移动次数k,一开始都选择往同一个方向移动(即正方向),当求和sum刚好等于target时,则找到了;若sum大于target,则需进一步讨论。

detal=sum-target,对于前面求和的某个数字x,使用加法对结果的影响是+x,而使用减法的影响是-x,则从加法改成减法,对结果sum的总影响就有2x。这个detal就可以看成总影响数。

  • 如果detal为偶数,而当前要加的数字index>detal/2,总能在[1,index]之间找到一个detal/2,来抵消这个影响,使得sum==target。

如:target=8

sum=1+2+3+4=10>target

detal=sum-target=10-8=2 (detal为偶数)

此时index=4 > 1=detal/2

此时只要修改1的符号就能使得sum=target

即-1+2+3+4=8

     若index<detal/2,则需要改变多个数字的符号才能产生detal/2的影响

  • 如果detal为奇数,而改变前面累加的任意一个数字的符号造成的影响都是偶数,因此是不可能满足条件的。因为target是不变的,要让sum的奇偶性改变,只能改变index,所以就转换成找index后面第一个奇数,由于不知道index的奇偶性,但是index后面两个数字总会找到一个奇数。所以只需要判断index+1和index+2就行了。

如:target=7

sum=1+2+3+4=10>target

detal=sum-target=10-7=3

detal为奇数,此时index=4,往后找,index=5时,detal=15-7=8,此时detal为偶数,detal/2=4,只需改变4的符号即可。

1+2+3-4+5=7,满足题意。 

忘记放代码了.....-_-

class Solution {
    public int reachNumber(int target) {
        int delta=0,sum=0,index=0;
        target=target>0?target:-target;
        while(sum<target){
            index++;
            sum+=index;
        }
        delta=sum-target;
        if(delta==0||delta%2==0){
            return index;
        }else{
            return (index+1)%2==1?index+1:index+2;
        }
        
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值