博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
31. Next Permutation (java 字典序生成下一个排列)
阅读量:6578 次
发布时间:2019-06-24

本文共 1674 字,大约阅读时间需要 5 分钟。

题目:

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

The replacement must be in-place, do not allocate extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.

1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

题意:

产生下一个序列,对给定序列进行重排,生成一个字母顺序比它更大的下一个序列。

如果给定的序列已经是按字母顺序排列中最大的一个了,则进行逆序排列。

算法在数组内进行,不要使用额外空间。

算法设计:

(1)从后向前遍历,找到第一个不满足降序的元素;若初始序列全部是降序,则i为-1,直接跳转至(3);

(2)将该元素同它后面的元素中比它大的第一个元素交换;

(3)将该元素后的所有元素排列,使之成为最小的排列。

代码:

public void nextPermutation(int[] nums) {        if(nums == null || nums.length == 0)            return;        //长度为1的数组        if (nums.length == 1) {            return;        }            //从后向前找到第一个不满足逆序的元素        int i = nums.length - 2;         for(; i >= 0 && nums[i] >= nums[i + 1]; --i); //注意,这里有=,可以排除含有重复元素的情况                //从i+1位置开始,向后查找比nums[i]大的最小元素        if(i >= 0){             int j = i + 1;            for(; j < nums.length && nums[j] > nums[i]; ++j);            swap(nums,i,j - 1); //交换,注意是同 j - 1交换        }                //将i之后的元素逆置(这里包含一种特殊情况,若该排列已经是字典序中的最大了,则下一个序列应该是最小字典序,因此,直接在这里逆置即可)        int k = nums.length - 1;        i++;        for(; i < k; i++, k--)            swap(nums, i, k);    }        /**     * 交换元素     * @param array     * @param i     * @param j     */    public void swap(int[] array,int i ,int j){        //交换        int tmp = array[i];        array[i] = array[j];        array[j] = tmp;    }

 

转载于:https://www.cnblogs.com/mydesky2012/p/5620006.html

你可能感兴趣的文章
hihocoder 1014 Trie树
查看>>
ADO.NET笔记——使用DataSet返回数据
查看>>
Python脚本日志系统
查看>>
gulp常用命令
查看>>
TCP(Socket基础编程)
查看>>
RowSet的使用
查看>>
每日一记--cookie
查看>>
WPF and Silverlight 学习笔记(十二):WPF Panel内容模型、Decorator内容模型及其他...
查看>>
IOS 7 Study - UISegmentedControl
查看>>
八、通用类型系统
查看>>
JQuery的ajaxFileUpload的使用
查看>>
关于Integer类中parseInt()和valueOf()方法的区别以及int和String类性的转换.以及String类valueOf()方法...
查看>>
ios 控制器的生命周期
查看>>
C#动态代理
查看>>
使用 sessionStorage 创建一个本地存储的 name/value
查看>>
Python笔记8----DataFrame(二维)
查看>>
JavaScript 特殊效果代码
查看>>
【?】codeforces721E Road to Home(DP+单调队列)
查看>>
MySQL 仅保留7天、一个月数据
查看>>
Win7下安装Mysql(解压缩版)
查看>>