我是靠谱客的博主 紧张帽子,最近开发中收集的这篇文章主要介绍31. 下一个排列题目描述解题过程总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

31. 下一个排列

  • 题目描述
  • 解题过程
    • 解题思路
  • 总结


题目描述

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

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

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

示例 1:

输入:nums = [1,2,3]
输出:[1,3,2]
示例 2:

输入:nums = [3,2,1]
输出:[1,2,3]
示例 3:

输入:nums = [1,1,5]
输出:[1,5,1]
示例 4:

输入:nums = [1]
输出:[1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解题过程

解题思路

这道题目首先要明白字典序的概念。
以下是参考自一篇博文的字典序描述:
从上面的全排列也可以看出来了,从左往右依次增大,对这就是字典序法。可是如何用算法来实现字典序法全排列呢?
我们再来看一段文字描述:(用字典序法找124653的下一个排列)
如果当前排列是124653,找它的下一个排列的方法是,从这个序列中从右至左找第一个左邻小于右邻的数
如果找不到,则所有排列求解完成,如果找得到则说明排列未完成
本例中将找到46,计4所在的位置为i,找到后不能直接将46位置互换,而又要从右到左到第一个比4大的数
本例找到的数是5,其位置计为j,将i与j所在元素交换125643
然后将i+1至最后一个元素从小到大排序得到125346,这就是124653的下一个排列
————————————————
版权声明:本文为CSDN博主「兰亭落雪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37050329/article/details/86637183
根据上面的描述,想到以下解决思路:
1、找到数组从右往左的第一个左邻小于右邻的数的下标,即这个左邻的下标i;
2、再次从右往左找第一个比i位置数大的数的下标j;
3、根据i和j判断nums[j]是否大于nums[i],若不是则表明不存在下一个更大的排列,将原数组从小到大排序即可,否则,交换nums[i]和nums[j],同时将i+1之后的数按从小到大排序。

class Solution {
    public void nextPermutation(int[] nums) {

        int i = nums.length - 2;

        while(i >= 0 && nums[i] >= nums[i + 1]){
            i--;
        }
        int j = nums.length - 1;
        while(j >= 0 && i >= 0 && nums[j] <= nums[i]){
            j--;
        }
        if(i < 0 || j < 0 || nums[j] <= nums[i]){//不存在下一个更大的排列
            Arrays.sort(nums);
        }else{
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
            //选择排序
            for(int k = i + 1; k < nums.length; k++){
                for(int z = k + 1; z < nums.length;z++){
                    if(nums[z] < nums[k]){
                        int tmp = nums[k];
                        nums[k] = nums[z];
                        nums[z] = tmp;
                    }
                }
            }
        }

    }
}

总结

暂时没有总结,待续。。。

最后

以上就是紧张帽子为你收集整理的31. 下一个排列题目描述解题过程总结的全部内容,希望文章能够帮你解决31. 下一个排列题目描述解题过程总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部