考察知识点:数组、双指针
题目分析:
因为在字典序中如果一个序列是单调递增的,那么这个序列就是由这些数所组成的最小序列。我们要找到一个较小的序列,可以从后向前遍历,找到第一个左边比右边大的数。例如 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;
}
};

京公网安备 11010502036488号