下一个排列
给定一个整数数组来表示排列,找出其之后的一个排列。
注意事项
排列中可能包含重复的整数
给出排列[1,3,2,3]
,其下一个排列是[1,3,3,2]
给出排列[4,3,2,1]
,其下一个排列是[1,2,3,4]
思路:
参考:https://www.cnblogs.com/bakari/archive/2012/08/02/2620826.html
如何计算字符串的下一个排列了?来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"、"52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数大的最小数(这个数必然存在),0、2都不行,5可以,将5和2交换得到"956220",然后再将替换点后的字符串"6220"颠倒即得到"950226"。
1 class Solution { 2 public: 3 /** 4 * @param nums: A list of integers 5 * @return: A list of integers 6 */ 7 int swap(int &a, int &b) 8 { 9 int tmp=a; 10 a=b; 11 b=tmp; 12 } 13 void reverseArray(vector<int> &nums, int begin, int end) 14 { 15 while(begin<end){ 16 swap(nums[begin], nums[end]); 17 ++begin; 18 --end; 19 } 20 } 21 vector<int> nextPermutation(vector<int> &nums) { 22 if(nums.size()<=1)return nums; 23 int i; 24 for(i=nums.size()-2; i>=0; --i)//找替换点i 25 { 26 if(nums[i]<nums[i+1])break; 27 } 28 if(i==-1){ 29 reverseArray(nums, 0, nums.size()-1); 30 return nums; 31 } 32 int j; 33 for(j=nums.size()-1; j>i; --j)//找出要和i替换的数的下标j 34 { 35 if(nums[i]<nums[j])break; 36 } 37 swap(nums[i], nums[j]);//替换 38 reverseArray(nums, i+1, nums.size()-1);//将i之后的数反转 39 return nums; 40 } 41 };
上一个排列
给定一个整数数组来表示排列,找出其上一个排列。
注意事项
排列中可能包含重复的整数
给出排列[1,3,2,3]
,其上一个排列是[1,2,3,3]
给出排列[1,2,3,4]
,其上一个排列是[4,3,2,1]
思路:和下一个排列的求法如出一辙。来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"、"52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数小的最小数(这个数必然存在),0可以,将0和2交换得到"906522",然后再将替换点后的字符串"6522"颠倒即得到"902256"。
1 class Solution { 2 public: 3 /* 4 * @param nums: A list of integers 5 * @return: A list of integers that's previous permuation 6 */ 7 void swap(int &a, int &b) 8 { 9 int tmp=a; 10 a=b; 11 b=tmp; 12 } 13 void reverseArray(vector<int> &nums, int begin, int end) 14 { 15 while(begin<end) 16 { 17 swap(nums[begin], nums[end]); 18 ++begin; 19 --end; 20 } 21 } 22 vector<int> previousPermuation(vector<int> &nums) { 23 if(nums.size()<=1)return nums; 24 int i; 25 for(i=nums.size()-2; i>=0; --i) 26 { 27 if(nums[i]>nums[i+1])break; 28 } 29 if(i==-1){ 30 reverseArray(nums, 0, nums.size()-1); 31 return nums; 32 } 33 int j; 34 for(j=nums.size()-1; j>=0; --j) 35 { 36 if(nums[j]<nums[i])break;//只改了一处 37 } 38 swap(nums[i], nums[j]); 39 reverseArray(nums, i+1, nums.size()-1); 40 return nums; 41 } 42 };