给定一个整数数组来表示排列,找出其上一个排列。
样例
给出排列[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<int> previousPermuation(vector<int> &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;
}
};
网友评论