leetcode 31Next Permutation

    xiaoxiao2021-03-25  83

    class Solution { public: void nextPermutation(vector<int>& nums) { int first=-1; for(int i = nums.size()-2 ; i>=0 ; i--) { if(nums[i]<nums[i+1]) { first = i; break; } } if(first == -1) {reverse(nums.begin(),nums.end());return;} int second; for(int i = nums.size()-1; i>=0; i--) { if(nums[i]>nums[first]) { second = i; break; } } swap(nums[first],nums[second]); reverse(nums.begin()+first+1,nums.end()); } }; 这道题一开始看了半天没看懂,后来才发现是求组成当前序列的全排列的下一个,如 1 2 3组成的全排列一共有6个按顺序来说是123,132,213,231,312,321,即每次都要增加最少。特别题目中提到321的下一个全排列是123,也就是最小的,所以如果对于类似于643541的下一个全排列,让它增加最少,后三位 5 4 1都是按照降序,排列的,已经达到了局部最小,所以就一定要在3上做文章了。将3替换成后三位比它大的最小数 就是4。换一下位置变为644531。显然后三位 135才是最小的。那么它的下一个全排列就是644135了。

    代码也可以根据上述思想来解答,先找出从后向前,非升序的第一个数,然后再从后向前找到第一个比它大的数换一下位置,因为后面的数还是按照升序排列,反转一下就成了最小了。

    转载请注明原文地址: https://ju.6miu.com/read-33956.html

    最新回复(0)