classSolution: defnextPermutation(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ n = len(nums) for i inrange(n - 2, -1, -1): if nums[i] < nums[i + 1]: break else: nums.reverse() return for j inrange(n - 1, i, -1): if nums[j] > nums[i]: nums[i], nums[j] = nums[j], nums[i] break l, r = i + 1, n - 1 while l < r: nums[l], nums[r] = nums[r], nums[l] l += 1 r -= 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { public: voidnextPermutation(vector<int>& nums){ int n = nums.size(); int i = n - 1; while (i > 0 && nums[i - 1] >= nums[i]) --i; if (i == 0) { reverse(begin(nums), end(nums)); return; } int j = n - 1; while (nums[j] <= nums[i - 1]) --j; swap(nums[i - 1], nums[j]); reverse(begin(nums) + i, end(nums)); } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { public: voidnextPermutation(vector<int>& nums){ int n = nums.size(); int i = n - 1; while (i > 0 && nums[i - 1] >= nums[i]) --i; if (i == 0) { reverse(begin(nums), end(nums)); return; } int j = lower_bound(begin(nums) + i, end(nums), nums[i - 1], greater()) - begin(nums) - 1; // 二分查找右边降序序列里倒数第一个比nums[i - 1]大的数的位置 swap(nums[i - 1], nums[j]); reverse(begin(nums) + i, end(nums)); } };