【问题标题】:All permutations of array where each element in the array must be increasing by range between 0 and n数组的所有排列,其中数组中的每个元素必须按 0 和 n 之间的范围增加
【发布时间】:2020-12-10 06:39:47
【问题描述】:

假设我有一个包含值的元素列表

[1, 2, 3, 5, 6, 7, 9, 12]

基本上,数组中的元素最多可以相差 n,在本例中为三个,按递增顺序排列。

上面的数组会这样工作:

2-1 = 1 | difference of 1
3-2 = 1 | difference of 1
5-3 = 2 | difference of 2
6-5 = 1 | difference of 1

等等。 我将如何找到长度为 x 且最大差为 n 的数组的所有排列?

【问题讨论】:

  • 那么......给定数组的有效排列是什么?
  • 我认为如果x=4n=2 那么[1,2,3,5] 将是一个有效的数字...
  • 既然你需要保持顺序,这很容易使用递归......
  • 不适用于递归,列表中有几百个元素。 ://
  • 2020 年代码出现第 10 天...

标签: python algorithm math rust array-algorithms


【解决方案1】:

假设您正在寻找绝对值的差异,您可以通过逐步将每个符合条件的元素添加到结果中来递归地执行此操作:

这是一个使用递归生成器函数的示例:

def permuteSort(A,maxDiff,previous=None):
    if not A: yield []; return
    for i,a in enumerate(A):           
        if previous is not None and abs(a-previous) > maxDiff:               
            continue
        yield from ([a]+p for p in permuteSort(A[:i]+A[i+1:],maxDiff,a))

输出

for p in  permuteSort([1, 2, 3, 5, 6, 7, 9, 12],3):
    print(p,"differences:",[b-a for a,b in zip(p,p[1:])])
        
  
[1, 2, 3, 5, 6, 7, 9, 12] differences: [1, 1, 2, 1, 1, 2, 3]
[1, 2, 3, 5, 7, 6, 9, 12] differences: [1, 1, 2, 2, -1, 3, 3]
[1, 2, 3, 6, 5, 7, 9, 12] differences: [1, 1, 3, -1, 2, 2, 3]
[1, 2, 5, 3, 6, 7, 9, 12] differences: [1, 3, -2, 3, 1, 2, 3]
[1, 3, 2, 5, 6, 7, 9, 12] differences: [2, -1, 3, 1, 1, 2, 3]
[1, 3, 2, 5, 7, 6, 9, 12] differences: [2, -1, 3, 2, -1, 3, 3]
[2, 1, 3, 5, 6, 7, 9, 12] differences: [-1, 2, 2, 1, 1, 2, 3]
[2, 1, 3, 5, 7, 6, 9, 12] differences: [-1, 2, 2, 2, -1, 3, 3]
[2, 1, 3, 6, 5, 7, 9, 12] differences: [-1, 2, 3, -1, 2, 2, 3]
[3, 1, 2, 5, 6, 7, 9, 12] differences: [-2, 1, 3, 1, 1, 2, 3]
[3, 1, 2, 5, 7, 6, 9, 12] differences: [-2, 1, 3, 2, -1, 3, 3]
[5, 2, 1, 3, 6, 7, 9, 12] differences: [-3, -1, 2, 3, 1, 2, 3]
[6, 3, 1, 2, 5, 7, 9, 12] differences: [-3, -2, 1, 3, 2, 2, 3]
[7, 5, 2, 1, 3, 6, 9, 12] differences: [-2, -3, -1, 2, 3, 3, 3]
[12, 9, 6, 3, 1, 2, 5, 7] differences: [-3, -3, -3, -2, 1, 3, 2]
[12, 9, 6, 7, 5, 2, 1, 3] differences: [-3, -3, 1, -2, -3, -1, 2]
[12, 9, 6, 7, 5, 2, 3, 1] differences: [-3, -3, 1, -2, -3, 1, -2]
[12, 9, 6, 7, 5, 3, 1, 2] differences: [-3, -3, 1, -2, -2, -2, 1]
[12, 9, 6, 7, 5, 3, 2, 1] differences: [-3, -3, 1, -2, -2, -1, -1]
[12, 9, 7, 5, 2, 1, 3, 6] differences: [-3, -2, -2, -3, -1, 2, 3]
[12, 9, 7, 5, 6, 3, 1, 2] differences: [-3, -2, -2, 1, -3, -2, 1]
[12, 9, 7, 5, 6, 3, 2, 1] differences: [-3, -2, -2, 1, -3, -1, -1]
[12, 9, 7, 6, 3, 1, 2, 5] differences: [-3, -2, -1, -3, -2, 1, 3]
[12, 9, 7, 6, 3, 5, 2, 1] differences: [-3, -2, -1, -3, 2, -3, -1]
[12, 9, 7, 6, 5, 2, 1, 3] differences: [-3, -2, -1, -1, -3, -1, 2]
[12, 9, 7, 6, 5, 2, 3, 1] differences: [-3, -2, -1, -1, -3, 1, -2]
[12, 9, 7, 6, 5, 3, 1, 2] differences: [-3, -2, -1, -1, -2, -2, 1]
[12, 9, 7, 6, 5, 3, 2, 1] differences: [-3, -2, -1, -1, -2, -1, -1]

【讨论】:

    【解决方案2】:

    试试这个递归。应该打印出所有允许的值。
    x 被描述为 required_numbern 被描述为 diff

    def getPermutations(cur_permutation, arr_to_check, required_number, diff):
        if len(arr_to_check) == 0:
            return
    
        if required_number == 0:
            print cur_permutation
            return
    
        cur_last_item = cur_permutation[-1]
        for index, arr_item in enumerate(arr_to_check):
            if arr_item - cur_last_item <= diff:
                new_copy = cur_permutation[:]
                new_copy.append(arr_item)
                return getPermutations(new_copy, arr_to_check[1:], required_number - 1, diff)
    

    (这也可以通过保持所需长度并检查cur_permutation 是否具有该长度来完成。

    【讨论】:

      猜你喜欢
      • 2019-12-18
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多