上一个排列算法java

来源:互联网 发布:openwrt防网络尖兵 编辑:程序博客网 时间:2024/05/19 23:26

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

样例
给出排列[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));    }*/    }}