当前位置: 面试刷题>> 下一个排列Ⅰ (经典算法题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 示例代码
```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 示例代码
```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 示例代码
```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]
```
**码小课网站中有更多相关内容分享给大家学习**,包括算法基础、数据结构、面试技巧等,欢迎访问码小课网站深入学习。