实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

分析:

这道题如果暴力解法的话,需要将可能的排列都写出来,并且用数组存储起来,不论是时间复杂度,亦或是空间复杂度都是不客观的。

可以通过一次遍历完成,从后向前遍历

如果后面的值一直比前面与他相邻的值大,那就说明目前的排序已经是最大值,我们按照题目需求,逆置数组即可

例如:7654321,965

如果后面的值比前面的值大时,将前面这个位置记录下来,可以用x来表示,之后,将x后面的所有值中大于x但是最接近x的值与x进行交换。

例如:115->151  4756->4765

但是这里有一个问题,对于一些排列无法得到想要的结果

例如:1765432->2765431 ,可以看到比1765432大的下一个数字应该是2176543,明显得到了错误的答案

因此我们需要加一步操作,在交换之后,对x之后的元素进行一次排序,使之变为升序排序

代码如下:

import java.util.Arrays;

public class Solution31 {
    public static void nextPermutation(int[] nums) {
        int i,j,t,flag=0,min,k=0;  //flag是用来记录当前序列是否为最大的序列,如果是其值为0,反之为1
        int n = nums.length;
        for(i=n-1;i>=1;i--)
        {
            if(nums[i]>nums[i-1])
            {
                flag = 1;
                break;
            }
    
        }
        if(flag==1)
        {
            min = nums[i];
            k = i;            
            for(j=i;j<n;j++)
            {
                if(nums[j]<min&&nums[j]>nums[i-1])
                {
                    min = nums[j];
                    k = j;
                }
            }
            t = nums[i-1];
            nums[i-1] = nums[k];
            nums[k] = t;
            Arrays.sort(nums, i, nums.length);
        }
        else
        {
            for(i=0;i<n/2;i++)
            {
                t = nums[i];
                nums[i] = nums[n-i-1];
                nums[n-i-1] = t;
            }
        }
        for(i=0;i<n;i++)
        {
            System.out.println(nums[i]);
        }
    }

public static void main(String[] args)
    {
        //int[] nums = {1,1,5};
        //int[] nums = {3,2,1};
        //int[] nums = {1,2,3};
        //int[] nums = {1,3,2};
        //int[] nums = {1,7,6,5,4,3,2};
        //int[] nums = {2,3,1};
        int[] nums = {5,4,7,5,3,2};
        nextPermutation(nums);
    }
}

Leetcode--31. 下一个排列相关推荐

  1. Java实现 LeetCode 31下一个排列

    31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...

  2. LeetCode 31. 下一个排列(线性扫描)

    1. 题目 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外 ...

  3. leetcode —— 31. 下一个排列

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...

  4. Leetcode 31. 下一个排列 (每日一题 20210831)

    实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数).如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列).必须 原地 ...

  5. LeetCode.31 下一个排列

    题目描述 实现获取下一个排列的算法,算法需要将给定的数组,重新排列成下一个更大的排列(即组合出下一个更大的数字). 如果不存在下一个更大的排列,则将数字重新排列成最小的排列. 题目思路 我们可以使用如 ...

  6. leetcode 31.下一个排列

    题目 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空 ...

  7. LeetCode 31. 下一个排列 Next Permutation

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...

  8. LeetCode 31 下一个排列

    https://leetcode-cn.com/problems/next-permutation/ 解决方案 class Solution {public void nextPermutation( ...

  9. 【LeetCode】【HOT】31. 下一个排列

    [LeetCode][HOT]31. 下一个排列 文章目录 [LeetCode][HOT]31. 下一个排列 package hot;import java.util.Arrays;public cl ...

  10. LeetCode每日一题--31. 下一个排列(数学)

    题目:跳转至 31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原 ...

最新文章

  1. mxnet输出训练loss
  2. 高通thermal-engine配置文件格式
  3. CentOS下设置服务自动启动的方法
  4. RASA NLU Chi安装
  5. Java和.NET(C#)的开发用到的技术对比总结
  6. 加密文件忘记密码怎么解密_MyBatis 配置文件 用户密码加密存储
  7. 去除linux 文件中的控制字符,Shell乱码文件中的控制字符处理
  8. ezcad旋转轴标刻参数_激光打标机软件ezcad中菜单下的旋转轴标刻功能介绍及其操作设置...
  9. 电脑重装系统 Win11 如何打开DirectX诊断工具
  10. AtCoder Grand Contest 007题解
  11. 梦工厂动画CEO:不迷信大数据,只迷信耐心与好故事
  12. 小程序如何加入企业微信群聊
  13. 怎样学习嵌入式软件开发
  14. Windows--从dos下进入D盘,切换盘符
  15. scylladb docker 运行试用
  16. 强化学习——蛇棋游戏gym环境搭建
  17. FX5U项目程序,用的三菱FX5U的PLC,里面有CC- LINK通讯机器人.自由口通讯仪表.以太网套接字通讯上位机
  18. VSCode运行Vue项目后自动打开浏览器
  19. 有关运算符详解补充(想起来就补一补!)
  20. 二维码扫描开源库ZXing定制化

热门文章

  1. 马尔可夫链蒙特卡罗法(Markov Chain Monte Carlo,MCMC)
  2. 交换机的基本配置实验报告_无线网络设计配置即实验报告
  3. 利用nginx建立windows软连,实现IP访问文件
  4. java 使用jar_Java 使用JAR文件
  5. 速览EMNLP 2020上录取的知识图谱相关论文
  6. Spring Cloud源码分析(二)Ribbon
  7. 论文浅尝 | LightRNN:存储和计算高效的 RNN
  8. 论文浅尝 | 对于知识图谱嵌入表示的几何形状理解
  9. 论文浅尝 | 面向自动分类归纳的端到端强化学习
  10. 文本相似度-相似度度量