75
这道题用双指针解,指针p0指向0应该在的位置,p1指向1应该在的位置。遍历数组,碰到1那就交换元素,增加指针,碰到0也交换元素,同时增加p0和p1两个指针。装入0两个指针应该是指向同一位置,装入1指针p1就会比指针p2要大,这时候如果数组出现了0,那就要交换p0指向的元素,这就会把1交换出去,顺序就乱了,所以遇到p0<p1而且是交换0的情况时,需要对1也交换一次。
31
这道题可以理解为一个数字,变换数字的排列顺序,求解比原本数字稍大一点的新数字。这里因为要稍微大一点,所以遍历顺序是后序。以排列 [4,5,2,6,3,1]为例:我们能找到的符合条件的一对「较小数」与「较大数」的组合为 222 与 333,满足「较小数」尽量靠右,而「较大数」尽可能小。当我们完成交换后排列变为 [4,5,3,6,2,1],此时我们可以重排「较小数」右边的序列,序列变为 [4,5,3,1,2,6]。(来自leetcode题解)
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int i = nums.size() - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i >= 0) {
int j = nums.size() - 1;
while (j >= 0 && nums[i] >= nums[j]) {
j--;
}
swap(nums[i], nums[j]);
}
reverse(nums.begin() + i + 1, nums.end());
}
};
287
这道题有点绕,见官方题解。