题目: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 。
提示:
-109 <= target <= 109
target != 0
起初我想到的是先一个个加上,直到刚好等于target那就结束,结果差1那就多两次(比如-3+4 两次刚好能补上差的1),差2那就多四次,以此类推 结果发现好像很蠢
看了题解才明白,
一个个加上,sum直到大于或者等于target,等于那就结束,sum大于target则需要看他们之间的差值奇偶
差值为偶数a = sum-target:则前面加上的数中必定存在一个a/2 ,只要把a/2的加变成减,那么刚好sum等于target 则次数与相等时一样
差值为奇数 a = sum-target:则我们需要把差值变为偶数情况然后按照偶数情况来计算。如何变呢? 当差值为奇数时会有两种情况:a = 奇数-偶数 a = 偶数-奇数 两种情况中,如果sum加上一个偶数,那么结果差值a还是为奇数,如果sum加上一个奇数,那么结果差值a就能变成偶数了,所以我们先加上 ans+1,如果ans+1是奇数那么计算结束,如果ans+1是偶数,那么ans+2必定为奇数,a = ( sum+ans+1+ans+2 ) - target ,a为偶数,可得出答案为ans+2
- class Solution {
- public:
- int reachNumber(int target) {
- target = abs(target);
- int ans = 0;
- int sum = 0 ;
- while( sum < target ){
- sum += ++ans;
- }
- return (sum-target)%2==0 ? ans :( (ans+1)%2 ? ans +1 : ans+2 );
- }
- };