lintcode(51)上一个排列

来源:互联网 发布:门诊收费软件 编辑:程序博客网 时间:2024/05/22 06:58

描述:

给定一个整数数组来表示排列,找出其上一个排列。

样例:

给出排列[1,3,2,3],其上一个排列是[1,2,3,3]

给出排列[1,2,3,4],其上一个排列是[4,3,2,1]

思路:

先找出操作的起始位置,从数组末尾开始找,nums.get(i) < nums.get(i-1)时,也就是后一个数小于前一个数时,这个时候就可以找到比现在的值小的值了;然后要将i-1位置的数进行处理,和当前值最接近的,新的第(i-1)位的值从i~end中找,小于并且最接近(i-1)的那位,然后(i)位置后的数字从大到小排列即可。

eg:

5,1,2,3,4

1,5,4,3,2(X)原因:没有找小于i位置且最接近的值

4,5,3,2,1

public class Solution {    /**     * @param nums: A list of integers     * @return: A list of integers that's previous permuation     * 真是繁琐     */    public ArrayList<Integer> previousPermuation(ArrayList<Integer> nums) {// write your codeif(nums == null || nums.size() <=1){    return nums;}int i = nums.size() - 1;for(;i>=1;i--){    if(nums.get(i) < nums.get(i-1)){        int count = i+1 ;        while(count < nums.size()){            if(nums.get(count) < nums.get(i-1) && nums.get(count) > nums.get(i)){                int p = nums.get(i);                nums.set(i , nums.get(count));                nums.set(count , p);            }            count++;        }        int temp = nums.get(i);        nums.set(i , nums.get(i-1));        nums.set(i-1 , temp);        for(int j = i;j<nums.size();j++){            for(int k = j+1;k<nums.size();k++){                if(nums.get(k)>nums.get(j)){                    int t = nums.get(j);                    nums.set(j , nums.get(k));                    nums.set(k , t);                }            }        }        break;        }}if(i == 0){    Collections.reverse(nums);}return nums;    }}



0 0