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


**题目描述补充**: 给定一个数字序列,编写一个函数来找到它的上一个排列。一个数字序列的“上一个排列”是指通过重新排列其数字形成的字典序中前一个排列,并且每个数字仅能使用一次。如果不存在上一个排列,则返回空数组或根据语言特性返回相应的“空”表示。 例如,给定序列 `[3,2,1]`,其上一个排列不存在,因此返回空数组 `[]` 或 `null`(根据编程语言)。给定序列 `[3,1,2]`,其上一个排列是 `[2,3,1]`。给定序列 `[1,3,2]`,其上一个排列是 `[1,2,3]`。 **注意**: 1. 所有输入的数字都是唯一的。 2. 输入的数组至少包含两个元素。 **PHP 示例代码**: ```php function prevPermutation(&$nums) { $n = count($nums); // 从右向左找到第一个不满足递增的元素 $i = $n - 2; while ($i >= 0 && $nums[$i] >= $nums[$i + 1]) { $i--; } if ($i < 0) { // 已经是最小排列,返回空数组 return []; } // 从右向左找到第一个比 nums[$i] 大的元素 $j = $n - 1; while ($nums[$j] <= $nums[$i]) { $j--; } // 交换 nums[$i] 和 nums[$j] list($nums[$i], $nums[$j]) = array($nums[$j], $nums[$i]); // 反转 nums[$i+1] 到 nums[$n-1] $left = $i + 1; $right = $n - 1; while ($left < $right) { list($nums[$left], $nums[$right]) = array($nums[$right], $nums[$left]); $left++; $right--; } return $nums; } // 示例 $nums = [3, 2, 1]; prevPermutation($nums); echo json_encode($nums); // 输出: [] $nums = [1, 3, 2]; prevPermutation($nums); echo json_encode($nums); // 输出: [1,2,3] ``` **Python 示例代码**: ```python def prevPermutation(nums): n = len(nums) i = n - 2 # 从右向左找到第一个不满足递增的元素 while i >= 0 and nums[i] >= nums[i + 1]: i -= 1 if i < 0: return [] # 从右向左找到第一个比 nums[i] 大的元素 j = n - 1 while nums[j] <= nums[i]: j -= 1 # 交换 nums[i] 和 nums[j] nums[i], nums[j] = nums[j], nums[i] # 反转 nums[i+1:] nums[i + 1:] = reversed(nums[i + 1:]) return nums # 示例 nums = [3, 2, 1] print(prevPermutation(nums)) # 输出: [] nums = [1, 3, 2] print(prevPermutation(nums)) # 输出: [1, 2, 3] ``` **JavaScript 示例代码**: ```javascript function prevPermutation(nums) { const n = nums.length; let i = n - 2; // 从右向左找到第一个不满足递增的元素 while (i >= 0 && nums[i] >= nums[i + 1]) { i--; } if (i < 0) { // 已经是最小排列,返回空数组 return []; } let j = n - 1; // 从右向左找到第一个比 nums[i] 大的元素 while (nums[j] <= nums[i]) { j--; } // 交换 nums[i] 和 nums[j] [nums[i], nums[j]] = [nums[j], nums[i]]; // 反转 nums[i+1] 到 nums[n-1] let left = i + 1, right = n - 1; while (left < right) { [nums[left], nums[right]] = [nums[right], nums[left]]; left++; right--; } return nums; } // 示例 const nums = [3, 2, 1]; console.log(prevPermutation(nums)); // 输出: [] const nums2 = [1, 3, 2]; console.log(prevPermutation(nums2)); // 输出: [1, 2, 3] ``` **码小课网站中有更多相关内容分享给大家学习**,希望这些示例能帮助你更好地理解和解决问题。
推荐面试题