lintcode(51)上一个排列

描述:

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

样例:

给出排列[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 code
		if(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;
    }
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值