题目:上一个排列


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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值