leetcode 31下一个排列

/**
验证一般情况(元素数目大于等于3)有几个情况分析:
两个特殊情况: 6 5 4 3 2 1 完全反序,这种序列没有下一个排序,因此重新排序1 2 3 4 5 6 1 2 3 4 5 6 完全升序,很容易看出翻转5 6得到下一个排序; 因此对于以下一般情况有: 1 2 6 5 4 3 找到右边第一个a[i]<a[i+1]的元素2,再从右往左找出2的下一个元素3,交换2,3,之后对2右边元素reverse; 1 2 5 4 6 3 从右往左找到第一个a[i]<a[i+1]的元素4,从右往左找到第一个大于4的元素6,交换4,6,之后对4右边的元素reverse; 这样操作是因为找到的元素a[i]的右侧已经全部为逆序了,下一个排列必然要带上i-1重新排;
即,找到a[i]后,以第i个元素为分界线,a[i]和a[i+1]是一个完全升序序列,a[i+1]到末尾是一个完全反序序列,对子问题进行分解交换即可; *
*/ class Solution { public: void nextPermutation(vector<int>& nums) { int len=nums.size(); if(len<=1) return; int i=len-2; while(i>=0&&nums[i]>=nums[i+1]) i--; if(i>=0){ int j=len-1; while(nums[j]<=nums[i]) j--; swap(nums,i,j); } reverse_rest(nums,i+1); } void reverse_rest(vector<int>&nums,int start){ int i=start,j=nums.size()-1; while(i<j){ swap(nums,i,j); i++;j--; } } void swap(vector<int>&nums,int i,int j){ int temp=nums[i]; nums[i]=nums[j]; nums[j]=temp; } };
原文地址:https://www.cnblogs.com/joelwang/p/10936268.html