Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 算法:从M到N的最小运算数,只有三个运算_Arrays_Algorithm - Fatal编程技术网

Arrays 算法:从M到N的最小运算数,只有三个运算

Arrays 算法:从M到N的最小运算数,只有三个运算,arrays,algorithm,Arrays,Algorithm,给出了两个正数M和N,现在您只能对M执行以下三种操作中的一种,如下所示: 加1、减1或乘2 Double:乘以2 减量:减去1 增量:加1 每次您都可以选择三个操作中的任意一个 输入:M=2,N=3 输出:1(2+1) 输入:M=2,N=5 输出:2(2*2,+1) 返回显示数字Y所需的最小操作数 这里可以使用BFS,但它的时间复杂度很高,可能是O(2^n)。 至于一个更简单的问题,leetcode991使用贪婪算法。因此,任何人都可以给出一个类似的答案。在每一步中,你都有一个数字。反过来,

给出了两个正数M和N,现在您只能对M执行以下三种操作中的一种,如下所示: 加1、减1或乘2

  • Double:乘以2
  • 减量:减去1
  • 增量:加1
每次您都可以选择三个操作中的任意一个

输入:M=2,N=3 输出:1(2+1)

输入:M=2,N=5 输出:2(2*2,+1)

返回显示数字Y所需的最小操作数

这里可以使用BFS,但它的时间复杂度很高,可能是O(2^n)。
至于一个更简单的问题,leetcode991使用贪婪算法。因此,任何人都可以给出一个类似的答案。

在每一步中,你都有一个数字。反过来,将其视为从N到M的行程。在位置x处,计算以下各项:

1. abs(x-M)
2. for even x, 1 + abs(x/2-M)
3. for odd x, 2 + abs((x+1)/2-M)
4. for odd x, 2 + abs((x-1)/2-M)
选择结果最小的选项,记下操作,然后重复。如果您选择了第一个选项,请停止

例如,M=17,N=39

x=39, the (1,2,3,4) tuple is (22, n/a, 4, 3), so we choose the fourth option.
x=19, we have (2, n/a, 8, 9), so we choose the first option 
现在我们把它们倒过来得到:17+1+1=19;19*2+1=39


这需要记录时间。

这是从leetcode991中更改的:未执行步骤。你能逐行提到它们吗?@vivek_23以输入:M=2,N=5为例。将M乘以2,得到4,将4乘以1,得到5。因此,根据需要只需两个步骤。我明白了吗?我指的不是过程,而是问题陈述本身。Double:乘以2意味着什么?格式不清楚。你能加一点吗?这是一个很好的解决方案。对于步骤,如果进行第一次操作,则添加abs(x-M);如果取第二个,x=x//2,加1;如果取第三个1,x=(x+1)//2,加2;如果取第三个1,x=(x-1)//2,然后加2。但我不知道如何证明这一点。你能解释一下这四个操作吗?在每一步中,我们都会回答这样的问题:“是增加我们到达目标的方式更好,还是(相反)除以2更好?”这里,(1)反映了增量选项,(2)到(4)是除以2的三种方式(因为你可能需要先增加或减少1)。是的,我得到了它。这是如何使用贪婪算法的一个很好的例子。谢谢