-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path31.下一个排列.ts
38 lines (36 loc) · 1.14 KB
/
31.下一个排列.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
* @lc app=leetcode.cn id=31 lang=typescript
*
* [31] 下一个排列
*/
// @lc code=start
/**
Do not return anything, modify nums in-place instead.
*/
// 算法描述:
//1、需要将一个左边的「较小数」与一个右边的「较大数」交换,以能够让当前排列变大,从而得到下一个排列。
//2、同时我们要让这个「较小数」尽量靠右,而「较大数」尽可能小。当交换完成后,「较大数」右边的数需要按照升序重新排列。这样可以在保证新排列大于原来排列的情况下,使变大的幅度尽可能小。
function nextPermutation(nums: number[]): void {
let i = nums.length - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i >= 0) {
let j = nums.length - 1;
while (j >= 0 && nums[i] >= nums[j]) {
j--;
}
[nums[i], nums[j]] = [nums[j], nums[i]];
}
const reverse = (nums: number[], start: number) => {
let left = start,
right = nums.length - 1;
while (left < right) {
[nums[left], nums[right]] = [nums[right], nums[left]];
left++;
right--;
}
};
reverse(nums, i + 1);
}
// @lc code=end