文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
下一个排列
解题思路
从低位挑一个大一点的数,交换前面一个小一点的数,变大的幅度要尽量小。
- [3, 2, 1],没有下一个排列,已经稳定了,没法变大了。
- [1, 5, 2, 4, 3, 2],从右往左,寻找第一个比右邻居小的数,把它换到后面去。
- 1 5 (2) 4 3 2,找到中间这个 (2),接着还是从右往左找,找第一个比 2 大的数和它交换,交换后:1 5 (3) 4 (2) 2。
- 此时还没结束,变大的幅度还可以再小一点,千位变大了,后三位可以继续再小一点。
- 后三位肯定是递减的,翻转,变为 [1, 5, 3, 2, 2, 4],即为所求。
代码实现
/**
Do not return anything, modify nums in-place instead.
*/
const nextPermutation = (nums: number[]): void => {
let i: number = nums.length - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i >= 0) {
let j: number = nums.length - 1;
while (j >= 0 && nums[j] <= nums[i]) {
j--;
}
[nums[i], nums[j]] = [nums[j], nums[i]];
}
let l: number = i + 1;
let r: number = nums.length - 1;
while (l < r) {
[nums[l], nums[r]] = [nums[r], nums[l]];
l++;
r--;
}
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论