首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >31. 下一个排列

31. 下一个排列

作者头像
名字是乱打的
发布2021-12-23 18:46:30
发布2021-12-23 18:46:30
32000
举报
文章被收录于专栏:软件工程软件工程
运行总次数:0
思路:

我们希望找到一种方法,能够找到一个大于当前序列的新序列,且变大的幅度尽可能小。

  • 我们需要将一个左边的「较小数」与一个右边的「较大数」交换,以能够让当前排列变大,从而得到下一个排列。同时我们要让这个「较小数」尽量靠右,而「较大数」尽可能小。
  • 当交换完成后,「较大数」右边的数需要按照升序重新排列。这样可以在保证新排列大于原来排列的情况下,使变大的幅度尽可能小。
  • 对于上面的第二句其实就是交换了以后使得我们被提前的那个数字后面的各位数字都是升序,这样后面的排列就是最小的,而且按照我们第一个步骤的筛选,我们要排序的是一个降序,我们把他改成升序
代码:
代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
    public void nextPermutation(int[] nums) {
        //如果从尾到头遍历一直是升序的,那么就反转数组
        //如果从尾到头遍历有降序,那么置换他俩
        //1 5 3 2
        int i=nums.length-2;

        //找到一个左边小右边大的停止
        while (i>=0&&nums[i]>=nums[i+1]){
            i--;
        }

        //如果能找到
        if (i>=0){
            int j=nums.length-1;
            //从右开始找,找到第一个大于i的数字交换
            while (j>=0&& nums[i]>=nums[j]){
                j--;
            }
            swap(nums,i,j);
        }
        reverse(nums, i+1);
    }
    public void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }


    //倒置start到最后一个元素直接的数组
    public void reverse(int[] nums, int start) {
        int left = start, right = nums.length - 1;
        while (left < right) {
            swap(nums, left, right);
            left++;
            right--;
        }
    }

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/7/6 上午,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思路:
  • 代码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档