当前位置: 首页 > 面试题库 >

您将如何迭代计算从0到N的所有可能排列?

晋俊贤
2023-03-14
问题内容

我需要迭代计算排列。方法签名如下所示:

int[][] permute(int n)

为了n = 3例如,返回值将是:

[[0,1,2],
 [0,2,1],
 [1,0,2],
 [1,2,0],
 [2,0,1],
 [2,1,0]]

您将如何以最有效的方式迭代进行此操作?我可以递归执行此操作,但是我有兴趣看到许多其他迭代执行方法。


问题答案:

请参阅QuickPerm算法,它是迭代的:http ://www.quickperm.org/

编辑:

为了清楚起见,在Ruby中进行了重写:

def permute_map(n)
  results = []
  a, p = (0...n).to_a, [0] * n
  i, j = 0, 0
  i = 1
  results << yield(a)
  while i < n
    if p[i] < i
      j = i % 2 * p[i] # If i is odd, then j = p[i], else j = 0
      a[j], a[i] = a[i], a[j] # Swap
      results << yield(a)
      p[i] += 1
      i = 1
    else
      p[i] = 0
      i += 1
    end
  end
  return results
end


 类似资料:
  • 问题内容: 在不求助于蛮力技术或任何需要STL的情况下,计算n个可能元素的所有可能的length-r组合的最快方法是什么? 在为数据结构课程中的最终项目开发Apriori算法时,我开发了一个有趣的解决方案,该解决方案使用了移位和递归,下面将向有 兴趣的人分享一下答案。但是,这是实现此目标的最快方法(不使用任何公共库)吗? 出于好奇,我提出的要求更多,因为我目前拥有的算法可以很好地满足我的目的。 问

  • 我正在尝试编写一种方法来将数组置换为所有可能的排列。我将每个数组以ArrayList的形式,翻转两个元素,然后将ArrayList返回到ArrayList of ArrayList。如果我在翻转两个元素后将每个数组打印到屏幕上,则按预期进行打印。[1,2,3]前两个元素翻转打印为[2,1,3],但当我将置换的ArrayList添加到另一个ArrayList时,它们都打印为[1,2,3] 代码: 输

  • 我有一个数字数组,现在我必须通过生成给定数组的所有可能子数组并应用一些条件来找到元素之和。 条件是,对于每个子阵列,获取最小值,并找到其中的元素总数,然后将两者相乘(最小值*总数)。最后,将所有子阵列的所有这些相乘值相加。 以下是问题陈述: 使用下面的公式找到所有可能的子数组的总和: 和(左,右)=(最小的arr[i]) * (∑ arr[i]),其中i的范围从左到右。 例子: 子数组是:[sta

  • 问题内容: 我有从0到8的数字。我想结果是这些数字的所有可能集合,每个集合都应使用所有数字,每个数字在集合中只能出现一次。 我希望看到用PHP制作的解决方案可以打印出结果。或者,至少,我希望在组合理论上有所收获,因为我早已忘记了它。计算多少排列的公式是什么? 示例集: 0-1-2-3-4-5-6-7-8 0-1-2-3-4-5-6-8-7 0-1-2-3-4-5-8-6-7 0-1-2-3-4-8

  • 我在计算这段从0到n打印所有斐波那契数的代码的时间复杂度。根据我的计算,方法需要,并且由于它被调用次数,所以它出来是。然而,书上说它是。有人能解释一下为什么这里的时间复杂度会是吗? 代码如下:

  • 我试图得到与输入arrayList相同长度的ArrayList的所有可能的排列。也就是说,1,2,3的ArrayList将导致123, 132, 213, 231, 321, 312,不包括1, 2, 12, 13等较短的排列。 坐标是一个类,它只有x、y和y,用于保存项目的二维点。 目前,我正在使用这段代码将其打印到控制台,但如果有人能告诉我如何将其存储到ArrayList中,我也将不胜感激