Перестановка массива целых чисел – это расположение его элементов в последовательности или линейном порядке.
Следующая перестановка массива целых чисел – это следующая лексикографически большая перестановка его целого числа.
Более формально: если все перестановки массива отсортированы в одном контейнере в соответствии с их лексикографическим порядком, то следующая перестановка этого массива – это перестановка, которая следует за ней в отсортированном контейнере.
Если такое расположение невозможно, массив должен быть переставлен в минимально возможном порядке (т.е. отсортирован в порядке возрастания).
Например, следующая перестановка arr = [1,2,3] равна [1,3,2].
Аналогично, следующая перестановка arr = [2,3,1] равна [3,1,2].
В то время как следующая перестановка arr = [3,2,1] равна [1,2,3], потому что [3,2,1] не имеет лексикографической более крупной перестановки.
Итак, да массив целых чисел nums
Нужно найти следующую перестановку в nums
.
Замена нужно сделать на месте (in-place) и нужно использовать только постоянную дополнительную память.
Входные данные: nums = [1,2,3]
Результат: [1,3,2]
Входные данные: nums = [3,2,1]
Результат: [1,2,3]
Входные данные: nums = [1,1,5]
Результат: [1,5,1]
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n = nums.size(), k, l;
for (k = n - 2; k >= 0; k--) { // поиск убывающей последовательности
if (nums[k] < nums[k + 1]) {
break;
}
}
if (k < 0) {
reverse(nums.begin(), nums.end());
} else {
for (l = n - 1; l > k; l--) { // поиск крайнего правого преемника для поворота
if (nums[l] > nums[k]) {
break;
}
}
swap(nums[k], nums[l]);
reverse(nums.begin() + k + 1, nums.end());
}
}
};
Согласно Википедии, человек по имени Нараяна Пандита представил следующий простой алгоритм для решения этой проблемы в 14 веке.
Нужно найти наибольший индекс k
такой, что nums[k]
< nums[k + 1]
. Если такого индекса не существует, нужно просто перевернуть nums
и готово.
Нужно найти наибольший индекс l > k
такой, что nums[k]
< nums[l]
.
Нужно поменять местами nums[k]
и nums[l]
.
Нужно перевернуть подмассив nums[k + 1:]
.