上一个排列算法java

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

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

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

注意
排列中可能包含重复的整数

思路
将整数数组a遍历,找到第一个a[i]>a[i+1]的位置,然后j=i,在while循环判断是否有a[j+1]>=a[i]的,找到记录j,然后交换a[i],a[j]。最后将i位置之后的数字倒叙,并将最终结果输出。

代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Test;



public class Solution{ 

    public ArrayList<Integer> previousPermuation(ArrayList<Integer> nums) {  
        // write your code  
        if(null==nums||0==nums.size()) return null;  
        int i = nums.size()-2;  
        while(i>=0){  
            if(nums.get(i)>nums.get(i+1)){  
                break;  
            }else{  
                i--;  
            }               
        }  
        if(i>=0){  
            //int j = i+1;  
            int j=i;
            while(j<nums.size()-1){  
                if(nums.get(j+1)>=nums.get(i)){  
                    break;  
                }else{  
                    j++;  
                }  
            }  
            //交换i,j的值  
            int tmp1 = nums.get(i);  
            int tmp2 = nums.get(j);  
            nums.set(i,tmp2);  
            nums.set(j, tmp1);  
        }         
        //翻转剩下的i+1开始的  
        reverse(nums, i+1);  
        return nums;  
    }  
    public void reverse(ArrayList<Integer> nums,int start){  
        int s = start;  
        int e = nums.size()-1;  
        while(s<e){  
            int tmp1 = nums.get(s);  
            int tmp2 = nums.get(e);  
            nums.set(s, tmp2);  
            nums.set(e, tmp1);  
            s++;  
            e--;  
        }  
    }  
    @Test
    public void test(){
        Integer []a={1,3,2,2,2,5};
        List<Integer> nlistArrayList=Arrays.asList(a);
        ArrayList<Integer> numsArrayList=new ArrayList(nlistArrayList);
        /*numsArrayList.add(0, 1);
      numsArrayList.add(1, 3);
      numsArrayList.add(2, 2);
      numsArrayList.add(3, 4);
      numsArrayList.add(4, 3);*/

        ArrayList<Integer> aList=previousPermuation(numsArrayList);
        System.out.println(Arrays.toString(aList.toArray()));
        /* for (int i = 0; i < aList.size(); i++) {
          System.out.println(aList.get(i));
    }*/

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值