问题描述
小F正在进行一个 AB 实验,需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1,+0 或 +1)。首末两步的步长必须是 1。求从 x 到 y 的最少步数。
输入描述
输入包含两个整数 x 和 y,表示起始位置和目标位置。
输出描述
输出从 x 到 y 所需的最小步数。
测试样例
样例1:
输入:
x_position = 12, y_position = 6
输出:4
老规矩,先问AI
问题分析
-
理解移动规则:
- 每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的
-1,+0或+1)。 - 首末两步的步长必须是
1。
- 每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的
-
目标:
- 计算从
x到y的最少步数。
- 计算从
解题思路
-
初始步数:
- 如果
x等于y,则不需要移动,步数为0。
- 如果
-
移动模式:
- 从
x到y的移动可以看作是一个逐步接近的过程。 - 每一步的步长可以是
1、0或-1,但首末两步必须是1。
- 从
-
步数计算:
- 我们可以通过模拟移动来计算步数。
- 每一步的步长可以是
1、0或-1,但首末两步必须是1
寄了,AI似乎没有理解题目逻辑,后面的提示中也同样在此处存在问题,所以本题得靠自己了。 我先简单概述一下题意。 呢 eg. x = 2 , y = 12 ,那么我们可能的一个走步是 2 +1 +2 +3 +2 +1 +1 = 12
这样应该很多人就理解题目了,我们可以 distance = y-x ; 存距离 ,step 存步长。
进一步分析,要想得到最小步数,step 应该是一个先增后减的序列,极限情况下,可以在 step 的峰值停留,即下一步 step +0,(后来我发现这里存在问题)
PS 我好像有了一个绝妙的想法,我就按新的讲吧,错了就当给个思路,旨在启发本文读者,新的思考比旧的解决方案更重要。
我们设上升序列共 rstep 步,此时 step = rstep,这时下降到 1 还需要 rstep-1 步 , 总步数 2 * rstep - 1 ,此时的移动距离为 (1+rstep-1)(rstep-1)/22+rstep , 即 rstep^2, 也就是说
- dis = 1 ,rstep = 1 ,总步数 1
- dis = 4 ,rstep = 2 ,总步数 3
- dis = 9 ,rstep = 3 ,总步数 5
- dis = 16 ,rstep = 4 ,总步数 7
总步数2n-1 可以覆盖dis 2n-1 ~~ n^2
对于 15 ,14, 我们可以认为 step为峰值时+0,即 +3+4+3 变成+3+3+3 ,+3+3+2
再来看偶数 总步数2 dis 2 总步数4 dis 4-6 总步数6 dis 6-12 总步数8 dis 8-20
总步数2n 可以覆盖到2n ~~ n^2+n
那新方法确实简单了,如下
public static int solution(int x_position, int y_position) {
// Please write your code here
int distance = Math.abs(x_position - y_position);
int minstep = 0;
if(distance==0) return 0;
for (int i = 1;; i++) {
if (i * i >= distance) {
minstep = 2 * i - 1;
break;
} else if (i * i + i >= distance) {
minstep = 2 * i;
break;
}
}
return minstep;
}