Сложность: medium
Предположим, у вас есть n целых чисел, пронумерованных от 1 до n. Перестановка этих n целых чисел perm (нумерация с 1) считается красивой, если для каждого i (1 <= i <= n) выполняется одно из следующих условий:
perm[i] делится на i.
i делится на perm[i].
Дано целое число n, верните количество красивых перестановок, которые вы можете создать.
Пример:
Input: n = 2
Output: 2
Explanation:
The first beautiful arrangement is [1,2]:
- perm[1] = 1 is divisible by i = 1
- perm[2] = 2 is divisible by i = 2
The second beautiful arrangement is [2,1]:
- perm[1] = 2 is divisible by i = 1
- i = 2 is divisible by perm[2] = 1
👨💻 Алгоритм:
1⃣Инициализация и подготовка массива:
Создайте массив чисел от 1 до N и инициализируйте счетчик красивых перестановок.
Создайте функцию для перестановки элементов массива.
2⃣Рекурсивное создание перестановок и проверка условий:
Напишите рекурсивную функцию для создания всех возможных перестановок массива, начиная с текущей позиции l.
На каждом шаге перестановки проверяйте, удовлетворяет ли текущий элемент условиям делимости. Если условие выполняется, продолжайте создание перестановок рекурсивно для следующей позиции.
3⃣Возврат результата:
В основной функции вызовите рекурсивную функцию с начальной позицией 0 и верните значение счетчика красивых перестановок.
😎 Решение:
class Solution {
private $count = 0;
function countArrangement($N) {
$nums = range(1, $N);
$this->permute($nums, 0);
return $this->count;
}
private function permute(&$nums, $l) {
if ($l == count($nums)) {
$this->count++;
}
for ($i = $l; $i < count($nums); $i++) {
$this->swap($nums, $i, $l);
if ($nums[$l] % ($l + 1) == 0 || ($l + 1) % $nums[$l] == 0) {
$this->permute($nums, $l + 1);
}
$this->swap($nums, $i, $l);
}
}
private function swap(&$nums, $x, $y) {
$temp = $nums[$x];
$nums[$x] = $nums[$y];
$nums[$y] = $temp;
}
}Ставь 👍 и забирай 📚 Базу знаний