Все перестановки массива, где каждый элемент массива должен увеличиваться в диапазоне от 0 до n

Скажем, у меня есть список элементов со значениями

[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?

Итак... что является допустимой перестановкой для данного массива?

MBo 10.12.2020 08:31

Я думаю, что если x=4 и n=2, то [1,2,3,5] будет правильным числом...

shapiro yaacov 10.12.2020 08:47

Поскольку вам нужно сохранить порядок, это очень легко использовать рекурсию...

shapiro yaacov 10.12.2020 08:48

С рекурсией не работает, в списке есть пара сотен элементов. :/

StarToLeft 10.12.2020 10:06

Пришествие Кода 2020 День 10...

hdost 10.12.2020 12:37

Юпп, я понятия не имею, как делать перестановки.

StarToLeft 10.12.2020 13:44

Если вы не ищете разницу между абсолютными значениями соседних элементов, будет либо только одно решение, либо его вообще не будет. Любой массив, который не находится в порядке возрастания, будет иметь отрицательную разницу между по крайней мере одним элементом и следующим. Отсортированный массив либо будет соответствовать вашему ограничению разницы, либо нет. Если вы на самом деле ищете различия в абсолютном значении, пожалуйста, будьте конкретны в своем вопросе.

Alain T. 11.12.2020 01:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
229
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте это как рекурсию. Должен распечатать все допустимые значения.
x описывается как required_number, а n есть 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 эту длину).

Ответ принят как подходящий

Предполагая, что вы ищете различия в абсолютном значении, вы можете сделать это рекурсивно, постепенно добавляя каждый подходящий элемент к результату:

вот пример использования рекурсивной функции генератора:

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]

Другие вопросы по теме