题目:上一个排列

来源:互联网 发布:江南杨治的妻子 知乎 编辑:程序博客网 时间:2024/05/24 04:30

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(null==nums||0==nums.size()) return null;         ArrayList<Integer> res = new ArrayList<>();         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;             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--;         }    }}  

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

您在真实的面试中是否遇到过这个题?

Yes





样例

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

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

注意

排列中可能包含重复的整数
标签 Expand   



相关题目 Expand   







解题思路:
比如排列是(2,4,1,3,5,6),前一个排列是(2,3,6,5,4,1)。求解过程如下
1.从右往左找到第一个i,a[i]>a[i+1]  ,上例中就是4,对应位置为1
下面分2种情况:
  • 找到了i>0,
2.从i开始,从左往右找到a[j+1]>a[i] ,上例即为3,对应位置为3
3.交换数组中i,j中的值,数组为(2,3,1,4,5,6)
4.将数组中i+1后的数字翻转,数组既是(2,3,6,5,4,1)
  • 没有找到,既是全部是递减的,比如123456,其直接翻转全部既是上一个排列


0 0
原创粉丝点击