lintcode 下一个排列(52)

来源:互联网 发布:notepad mac 编辑:程序博客网 时间:2024/04/28 12:31

给定一个整数数组来表示排列,找出其之后的一个排列。

 注意事项

排列中可能包含重复的整数

样例

给出排列[1,3,2,3],其下一个排列是[1,3,3,2]

给出排列[4,3,2,1],其下一个排列是[1,2,3,4]

********************************************************************************************

这问题类似于全排列问题,全排列问题有一种解法,叫字典序法。     参考  点击打开链接

题目意思是找,比给定序列大一点的最小序列。

步骤:

1.从右至左找第一个升序的两个元素。A[k]<A[k+1]

2.从右至k,找到第一个比A[k]大的元素A[i],交换A[k],  A[k]的位置

3.反转k+1到最后的元素


    vector<int> nextPermutation(vector<int> &nums) {        // write your code here        int p;        int i;        for(i=nums.size()-2;i>=0;i--){            if(nums[i]<nums[i+1]){                p=i;                break;            }        }        if(i<0){            sort(nums.begin(),nums.end());            return nums;        }                for(i=nums.size()-1;i>p;i--){            if(nums[i]>nums[p]){                 swap(nums[i],nums[p]);                break;            }        }                reverse(nums.begin()+p+1,nums.end());        return nums;            }
*******************************************************************************************************

类似得到      上一个排列   的题目

    vector<int> previousPermuation(vector<int> &nums) {        // write your code here        int p;        int i;        for(i=nums.size()-2;i>=0;i--){            if(nums[i]>nums[i+1]){                p=i;                break;            }        }        if(i<0){            sort(nums.begin(),nums.end());            reverse(nums.begin(),nums.end());            return nums;        }                for(i=nums.size()-1;i>p;i--){            if(nums[i]<nums[p]){                 swap(nums[i],nums[p]);                break;            }        }                reverse(nums.begin()+p+1,nums.end());        return nums;    }




0 0