考察知识点:数组、双指针
题目分析:
因为在字典序中如果一个序列是单调递增的,那么这个序列就是由这些数所组成的最小序列。我们要找到一个较小的序列,可以从后向前遍历,找到第一个左边比右边大的数。例如 1 2 3 4 7 6 5 8 9
然后6之后的数就一定是一个递增的序列。在这个序列中找到第一个比6小的数,就是5。为什么找比6小的数?我们可以看到如果我们取比6大的数来交换,那么新的序列就会比原序列大,所以我们应找在右边的递增序列中到比6小的最大的那个数(第一个比6小的数)。
交换这两个数的位置之后发现仍然不满足条件,因为此时6 8 9 是递增序列,是之前的所有数确定好后的最小序列。而由于5和6的交换一定使序列变小了,我们应该考虑怎样确定6、8和9才能让这个较小值最大。让较小值最大就是找到比原序列在字典序中更小一个的排列。很明显应该将6、8 和9降序排列。由于6、8 和 9这部分一定是升序的,所以我们翻转这部分即可得到降序序列。
所用编程语言:C++
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param cows int整型vector * @return int整型vector */ vector<int> nextPermutation(vector<int>& cows) { // write code here int size = cows.size(); int i = size - 2; while (i >= 0 && cows[i] <= cows[i + 1]) i--; if (i >= 0) { int j = size - 1; while (j >= 0 && cows[i] <= cows[j]) j--; swap(cows[i], cows[j]); } reverse(cows.begin() + i + 1, cows.end()); return cows; } };