031下一个排列
自解法 20ms
使用一遍法,从右向左依次比较相邻两个数字,看其是否为降序排列[降序排列无更大的排列了]
当出现升序排列时,只需要将此处的数字与其右端比其大一点点的数进行交换,再将【i-1】右端的数进行升序排列
就得到比目前大一点的排列了。如图所示
1 class Solution { 2 public: 3 void nextPermutation(vector<int>& nums) { 4 if (nums.size() == 0)return; 5 int flag = 1;//用来标记原排列是否无再大的排列 6 for (int i = nums.size() - 1; i > 0; --i) {//从右端开始比较 7 if (nums[i - 1] < nums[i])//此处为升序排列 8 for (int j = nums.size() - 1; j > i - 1; --j) //找到比[i-1]大一点点的数 9 if (nums[i - 1] < nums[j]) { 10 swap(nums[i-1],nums[j]); 11 flag = 0;//存在更大的排列 12 sort(nums.begin()+i, nums.end()); //再将【i - 1】右端的数进行升序排列 13 return; 14 } 15 } 16 if (flag)//无再大的排列了,那么就返回最小排列 17 sort(nums.begin(), nums.end()); 18 return; 19 } 20 };
//使用C++的排列函数next_permutation 32ms
1 class Solution { 2 public: 3 void nextPermutation(vector<int>& nums) { 4 if (!(next_permutation(nums.begin(), nums.end())))//如果没有更大的排列了 5 sort(nums.begin(), nums.end());//那就返回升序【最小排列】 6 } 7 };
//博客代码
//与自己的解法一样,只不过代码更简洁,时间一样,内存多了一点点
1 class Solution { 2 public: 3 void nextPermutation(vector<int>& nums) { 4 int n = nums.size(), i = n - 2, j = n - 1; 5 while (i >= 0 && nums[i] >= nums[i + 1]) --i; 6 if (i >= 0) { 7 while (nums[j] <= nums[i]) --j; 8 swap(nums[i], nums[j]); 9 } 10 reverse(nums.begin() + i + 1, nums.end()); 11 } 12 };