返回介绍

下一个排列

发布于 2024-09-16 00:06:32 字数 1056 浏览 0 评论 0 收藏 0

题目内容

解题思路

从低位挑一个大一点的数,交换前面一个小一点的数,变大的幅度要尽量小。

  • [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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文