Рубрики
Без рубрики

День 31 – Следующая перестановка

Проблема реализует следующую перестановку, которая переставляет числа в лексикографическую … Tagged with Leetcode, Python, Challenge.

Проблема

Реализация Следующая перестановка , который переставляет числа в лексикографически следующую большую перестановку чисел.

Если такое расположение невозможно, оно должно изменить его как самый низкий возможный порядок (то есть отсортированный в порядке возрастания).

Замена должна быть на месте и использовать только постоянную дополнительную память.

Пример 1:

Input: nums = [1,2,3]
Output: [1,3,2]

Пример 2:

Input: nums = [3,2,1]
Output: [1,2,3]

Пример 3:

Input: nums = [1,1,5]
Output: [1,5,1]

Пример 4:

Input: nums = [1]
Output: [1]

Ограничения:

  • 1. длиной
  • 0 [i]

Тесты

import pytest
from .Day31_NextPermutation import Solution

s = Solution()


@pytest.mark.parametrize(
    "nums,expected",
    [
        ([1, 2, 3], [1, 3, 2]),
        ([3, 2, 1], [1, 2, 3]),
        ([1, 1, 5], [1, 5, 1]),
        ([1], [1]),
    ],
)
def test_next_permutation(nums, expected):
    s.nextPermutation(nums)

    assert nums == expected

Решение

from typing import List


class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        i = len(nums) - 2
        while i >= 0 and nums[i + 1] <= nums[i]:
            i -= 1

        if i >= 0:
            j = len(nums) - 1
            while j >= 0 and nums[j] <= nums[i]:
                j -= 1
            nums[i], nums[j] = nums[j], nums[i]

        k = len(nums) - 1
        while i < k:
            i += 1
            nums[i], nums[k] = nums[k], nums[i]
            k -= 1

Анализ

Оригинал: “https://dev.to/ruarfff/day-31-next-permutation-5d2j”