Lintcode 上一个排列

来源:互联网 发布:淘宝店铺违规虚假交易 编辑:程序博客网 时间:2024/05/14 00:32

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

 注意事项

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

样例

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

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

标签 
LintCode 版权所有 排列
思路:逆序找到第一个不是递减的数位置为i,从位置i+1开始找最大的且小于nums[i]的数,将其与nums[i],交换位置,然后从位置i+1开始到n-1逆序,即得到上一个排列。

class Solution {public:    /**     * @param nums: An array of integers     * @return: An array of integers that's previous permuation     */     vector<int> epiloge(vector<int> &temp,int k,int n){      vector<int> result;      for(int i=0;i<=k;i++)          result.push_back(temp[i]);          for(int i=n-1;i>k;i--)      result.push_back(temp[i]);            return result;     }    void swap(vector<int> &temp,int l,int k){        int a;        a=temp[k];        temp[k]=temp[l];        temp[l]=a;    }         vector<int> previousPermuation(vector<int> &nums) {        // write your code here        int n=nums.size();        int i=n-1;        while(nums[i]>=nums[i-1]&&i!=0){            i--;        }        i--;   //     cout<<nums[i]<<" "<<i<<endl;        if(-1==i)        return epiloge(nums,-1,n);        else{            int max=nums[i+1];            int k=i+1;            int j;            for(j=i+1;i<n;j++){                if(nums[j]<nums[i]&&nums[j]>=max){                max=nums[j];                k=j;                }                else                break;            }            swap(nums,i,k);           return epiloge(nums,i,n);        }    }};


0 0
原创粉丝点击