75、31、287

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

这道题有点绕,见官方题解。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容