给定无限线上的目标位置,即-infinity到+ infinity。从表格0开始,您必须按如下所述通过移动来达到目标:在第一种移动中,您可以向前或向后迈出i步。找到达到目标所需的最小移动量。
例子 :
Input : target = 3
Output : 2
Explanation:
On the first move we step from 0 to 1.
On the second step we step from 1 to 3.
Input: target = 2
Output: 3
Explanation:
On the first move we step from 0 to 1.
On the second move we step from 1 to -1.
On the third move we step from -1 to 2.
我们在下面的文章中讨论了一个幼稚的递归解决方案。
到达目的地的最少步骤
如果目标为负,则可以将其视为正,因为我们以对称方式从0开始。
想法是尽可能向一个方向移动,这将使移动最小化。从0开始,第一步将我们带到1,第二步将我们带到3(1 + 2)位置,第三步将我们带到6(1 + 2 + 3)位置,依此类推;因此,为了找到目标,我们继续添加动作,直到找到第n个动作,使得1 + 2 + 3 +…+ n> = target。现在,如果总和(1 + 2 + 3 +…+ n)等于目标,我们的工作就完成了,即,我们需要n步才能达到目标。现在,下一个总和大于目标的情况。通过我们领先多少,即总和目标,找到差异。设差为d =总和–目标。
如果我们向后移动第i个,则新的总和将变为(sum – 2i),即1 + 2 + 3 +…-x + x + 1…+ n。现在,如果sum-2i = target,那么我们的工作就完成了。由于sum – target = 2i,即相差应该是偶数,因为我们将得到一个整数i翻转,它将给出答案。因此出现以下情况。
情况1:差异是偶数,答案是n(因为我们总是会碰到目标,因此会产生翻转)。
情况2:差是奇数,那么我们又迈出了一步,即将n + 1相加,然后再次求差。如果答案是n + 1,那么答案是n + 2。
说明:由于差异是奇数。目标是奇数或偶数。
情况1:n为偶数(1 + 2 + 3 +…+ n),然后加n + 1会使差为偶数。
情况2:n为奇数,那么即使再加上n + 1也无济于事,所以我们还得再走一步,所以n + 2。
例子:
目标= 5。
我们会不断采取行动,直到达到目标或我们越过目标为止。
总和= 1 + 2 + 3 = 6> 5,步长= 3。
差= 6 – 5 =1。由于差是一个奇数值,因此我们无法通过将+ i的任何移动翻转到-i来达到目标。因此,我们增加了一步。我们需要将步长增加2以获得偶数差(因为n为奇数,而目标也为奇数)。现在我们有了一个均匀的差,只要改变值的总和等于差的一半,我们就可以简单地将任何移动向左移动(即,将+更改为-)。我们可以切换1和4或2和3或5。
C++
// CPP program to find minimum moves to
// reach target if we can move i steps in
// i-th move.
#include
using namespace std;
int reachTarget(int target)
{
// Handling negatives by symmetry
target = abs(target);
// Keep moving while sum is smaller or difference
// is odd.
int sum = 0, step = 0;
while (sum < target || (sum - target) % 2 != 0) {
step++;
sum += step;
}
return step;
}
// Driver code
int main()
{
int target = 5;
cout << reachTarget(target);
return 0;
}
Java
// Java program to find minimum
//moves to reach target if we can
// move i steps in i-th move.
import java.io.*;
import java.math.*;
class GFG {
static int reachTarget(int target)
{
// Handling negatives by symmetry
target = Math.abs(target);
// Keep moving while sum is smaller
// or difference is odd.
int sum = 0, step = 0;
while (sum < target || (sum - target) % 2
!= 0) {
step++;
sum += step;
}
return step;
}
// Driver code
public static void main(String args[])
{
int target = 5;
System.out.println(reachTarget(target));
}
}
// This code is contributed by Nikita tiwari.
Python 3
# Python 3 program to find minimum
# moves to reach target if we can
# move i steps in i-th move.
def reachTarget(target) :
# Handling negatives by symmetry
target = abs(target)
# Keep moving while sum is
# smaller or difference is odd.
sum = 0
step = 0
while (sum < target or (sum - target) %
2 != 0) :
step = step + 1
sum = sum + step
return step
# Driver code
target = 5
print(reachTarget(target))
# This code is contributed by Nikita Tiwari
C#
// C# program to find minimum
//moves to reach target if we can
// move i steps in i-th move.
using System;
class GFG {
static int reachTarget(int target)
{
// Handling negatives by symmetry
target = Math.Abs(target);
// Keep moving while sum is smaller
// or difference is odd.
int sum = 0, step = 0;
while (sum < target ||
(sum - target) % 2!= 0)
{
step++;
sum += step;
}
return step;
}
// Driver code
public static void Main()
{
int target = 5;
Console.WriteLine(reachTarget(target));
}
}
// This code is contributed by vt_m.
PHP
Javascript
输出 :
5