lintcode 上一个排列

给定一个整数数组来表示排列,找出其上一个排列。
样例
给出排列[1,3,2,3],其上一个排列是[1,2,3,3]
给出排列[1,2,3,4],其上一个排列是[4,3,2,1]

上一个排列是指在该数组所有的排列中,比这个排列小且小的最少的那个排列,因此优先从个位、十位、百位。。。考虑。设置两个指针,其中一个指针从末尾开始遍历,另一个指针从末尾遍历到当前另一个指针的位置,只要发现高位有比低位大的数,交换一下位置,再把高位后面的数反转即可(这样才能保证新数的数比原来的数大的最少,是挨着的排列)。如果遍历到高位,并且没有交换的话,说明这个排列是所有排列中最小的,只要翻转一下数组就可以了。

class Solution {
public:
    /**
     * @param nums: An array of integers
     * @return: An array of integers that's previous permuation
     */
    vector previousPermuation(vector &nums) {
        // write your code here
        for (int i = nums.size()-1;i >= 0;i--) {
            for (int j = nums.size()-1;j > i;j--) {
                if (nums[i] > nums[j]) {
                    swap(nums[i],nums[j]);
                    reverse(nums.begin()+i+1,nums.end());
                    return nums;
                }
            }
        }
        reverse(nums.begin(),nums.end());
        return nums;
    }
};

你可能感兴趣的:(lintcode 上一个排列)