【LeetCode】31. Next Permutation(C++)

地址:https://leetcode.com/problems/next-permutation/

题目:

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

The replacement must be in-place and use only constant extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.

1,2,31,3,2
3,2,11,2,3
1,1,51,5,1

理解:

按字典序排列的下一个比这个元素大的元素。如果已经是最大,就返回最小。
想到了找到数组中后一个大于前一个的位置,但是具体怎么换还是比较懵逼。看了看别人给的解法,总结了一下思路。

  • 从后向前找到第一个位置i,使得nums[i-1]<nums[i]
    • 如果存在,需要调整的就是从i-1到数组末尾的元素。注意到i的位置满足,从i到size()-1是不增的。且从nums[i]-nums[nums.size()-1]一定能找到一个比nums[i-1]大的元素。
      • 寻找i-size()-1的最小的大于nums[i-1]的元素,记为nums[j]
      • 交换nums[i-1]nums[j]。注意到交换后,从nums[i]nums[nums.size()-1]仍然是非增的。因此,把后面的直接翻转,就得到了字典序第一个比输入大的结果。
    • 如果不存在,直接翻转整个数组。

实现:

class Solution {
public:
	void nextPermutation(vector<int>& nums) {
		int i;
		for (i = nums.size() - 1; i > 0; --i) {
			if (nums[i - 1] < nums[i])
				break;
		}
		if (i > 0) {
			int j = nums.size() - 1;
			while (nums[j] <= nums[i - 1])
				--j;
			swap(nums[i - 1], nums[j]);
		}
		reverse(nums.begin() + i, nums.end());
	}
};

后记:

这个竟然有一个对应的库函数,也是十分神奇。。

猜你喜欢

转载自blog.csdn.net/Ethan95/article/details/84339626