描述:
给定一个整数数组来表示排列,找出其上一个排列。
样例:
给出排列[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;
}
}