标签:public i+1 amp for 时间复杂度 reverse eve swa ret
很tricky的一道题,想通之后不难。
一个数组,从后往前找,找到第一个 nums[i]<nums[i+1] 的下标,因此下标 i+1 ~ n-1 的数组元素都是递减的,这一串序列已经是最大的了,找不到next permutation,因此我们必须找到 i ~ n-1 这一串序列的next permutation。
这也很容易,我们只要在后面找到第一个大于 nums[i] 的元素,与 nums[i] 交换(这样这一位一定是最小的了),然后把 i+1 ~ n-1 的序列 reverse 一下就好了。
当然找第一个大于 nums[i] 的元素可以用二分优化,但是无论如何,总体的时间复杂度都是 O(n)。
class Solution { public: void nextPermutation(vector<int>& nums) { int i, j; for (i=nums.size()-2;i>=0;--i){ if (nums[i]<nums[i+1]) break; } if (i==-1){ // all in descending order reverse(nums.begin(),nums.end()); return; } for (j=nums.size()-1;j>=i+1;--j){ if (nums[j]>nums[i]) break; } swap(nums[i],nums[j]); reverse(nums.begin()+i+1,nums.end()); } };
标签:public i+1 amp for 时间复杂度 reverse eve swa ret
原文地址:https://www.cnblogs.com/hankunyan/p/9899863.html