开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情
今天应该是居家的第三天了,具体是周几已经不记得了
到达终点数字
该题出自力扣的754题 —— 到达终点数字【中等题】
审题
在一根无限长的数轴上,你站在0的位置。终点在target的位置。 你可以做一些数量的移动 numMoves : 每次你可以选择向左或向右移动。 第 i 次移动(从 i == 1 开始,到 i == numMoves ),在选择的方向上走 i 步。 给定整数 target ,返回 到达目标所需的 最小 移动次数(即最小 numMoves ) 。
- 这道题如果太较真,那就不容易做了,其实就是一道选择对称性的题目,给出一个target的变量,返回从0到这个变量所需要的步数,每i次行动就意味着走i步
- 那么答案有一个最小的下界n,也就是1到n的和必须不小于target,原因是,假如全都取正,总和都达不到target,那么一定不能通过改变某些步骤的方向来达到目的
- 那么显而易见的,虽然说第i步有可能大于变量target,但是可以选择负数的i,也就是左边
- 首先target是正是负无所谓,无非就是换方向的问题,因此不妨假设方向是正的。利用Math.abs去计算出距离的绝对值
- 计算出走到这个距离所需要的步数和距离
- 当这个结论是偶数时,也就是比如sum-target=4,那么我们把2变成-2,那么sum减小了4。
- 当这个结论是奇数时,很明显可以再走两步达到目的:第一步向回走,第二步向前走,例如 sum -target = 3,那么就需要进行两步操作,1和2
编码
class Solution {
public int reachNumber(int target) {
int t = Math.abs(target);
int num = 0, sum = 0;
while (t>sum){
num++;
sum+=num;
}
int dt = sum - t;
if ((dt & 1) != 0){
if ((num & 1) == 0) {
num++;
}else {
num+=2;
}
}
return num;
}
}