首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数组的所有排列,其中数组中的每个元素必须按0和n之间的范围增加。

数组的所有排列,其中数组中的每个元素必须按0和n之间的范围增加。
EN

Stack Overflow用户
提问于 2020-12-10 06:39:47
回答 2查看 208关注 0票数 0

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

代码语言:javascript
运行
复制
[1, 2, 3, 5, 6, 7, 9, 12]

基本上,数组中的元素可能存在n的差异,在这种情况下是3,按递增顺序排列。

上面的数组的工作方式如下:

代码语言:javascript
运行
复制
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的数组的所有排列?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-11 01:06:24

假设您正在寻找绝对值的差异,则可以通过逐步将每个合格元素添加到结果中来递归地做到这一点:

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

代码语言:javascript
运行
复制
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))

输出

代码语言:javascript
运行
复制
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]
票数 1
EN

Stack Overflow用户

发布于 2020-12-10 08:05:57

将此作为递归进行尝试。应该打印出所有允许的值。

x被描述为required_numberndiff

代码语言:javascript
运行
复制
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是否为该长度来完成)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65229618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档