当前位置: 面试刷题>> 下一个排列Ⅰ (经典算法题500道)


题目描述补充

题目:下一个排列Ⅰ

给定一个整数数组 nums,其中元素已按非递减顺序排列。编写一个函数,将 nums 重新排列成下一个排列,即字典序上比当前排列大的最小排列。

注意

  • 数组中的元素个数在范围 [1, 100] 内。
  • 0 <= nums[i] <= 100

示例 1:

输入: nums = [1,2,3]
输出: [1,3,2]

示例 2:

输入: nums = [3,2,1]
输出: [1,2,3]

示例 3:

输入: nums = [1,1,5]
输出: [1,5,1]

PHP 示例代码

function nextPermutation(&$nums) {
    $n = count($nums);
    $i = $n - 2;
    // 从右向左找到第一个相邻的元素对 (i, i+1),使得 nums[i] < nums[i+1]
    while ($i >= 0 && $nums[$i] >= $nums[$i + 1]) {
        $i--;
    }
    if ($i >= 0) {
        $j = $n - 1;
        // 从右向左找到第一个大于 nums[i] 的元素 nums[j]
        while ($j >= 0 && $nums[$j] <= $nums[$i]) {
            $j--;
        }
        // 交换 nums[i] 和 nums[j]
        $temp = $nums[$i];
        $nums[$i] = $nums[$j];
        $nums[$j] = $temp;
    }
    // 反转 i+1 及其之后的元素
    $left = $i + 1;
    $right = $n - 1;
    while ($left < $right) {
        $temp = $nums[$left];
        $nums[$left] = $nums[$right];
        $nums[$right] = $temp;
        $left++;
        $right--;
    }
}

// 示例用法
$nums = [1,2,3];
nextPermutation($nums);
print_r($nums); // 输出: Array ( [0] => 1 [1] => 3 [2] => 2 )

Python 示例代码

def nextPermutation(nums):
    i = j = len(nums) - 2
    # 找到第一个相邻的元素对 (i, i+1),使得 nums[i] < nums[i+1]
    while i >= 0 and nums[i] >= nums[i + 1]:
        i -= 1
    if i >= 0:
        # 找到第一个大于 nums[i] 的元素 nums[j]
        while j >= 0 and nums[j] <= nums[i]:
            j -= 1
        # 交换 nums[i] 和 nums[j]
        nums[i], nums[j] = nums[j], nums[i]
    # 反转 i+1 及其之后的元素
    left, right = i + 1, len(nums) - 1
    while left < right:
        nums[left], nums[right] = nums[right], nums[left]
        left, right = left + 1, right - 1

# 示例用法
nums = [1,2,3]
nextPermutation(nums)
print(nums)  # 输出: [1, 3, 2]

JavaScript 示例代码

function nextPermutation(nums) {
    let i = nums.length - 2;
    // 找到第一个相邻的元素对 (i, i+1),使得 nums[i] < nums[i+1]
    while (i >= 0 && nums[i] >= nums[i + 1]) {
        i--;
    }
    if (i >= 0) {
        let j = nums.length - 1;
        // 找到第一个大于 nums[i] 的元素 nums[j]
        while (j >= 0 && nums[j] <= nums[i]) {
            j--;
        }
        // 交换 nums[i] 和 nums[j]
        [nums[i], nums[j]] = [nums[j], nums[i]];
    }
    // 反转 i+1 及其之后的元素
    let left = i + 1, right = nums.length - 1;
    while (left < right) {
        [nums[left], nums[right]] = [nums[right], nums[left]];
        left++;
        right--;
    }
}

// 示例用法
let nums = [1,2,3];
nextPermutation(nums);
console.log(nums); // 输出: [1, 3, 2]

码小课网站中有更多相关内容分享给大家学习,包括算法基础、数据结构、面试技巧等,欢迎访问码小课网站深入学习。

推荐面试题