[LeetCode] 31. Next Permutation

来源:互联网 发布:mysql语句优化方法 编辑:程序博客网 时间:2024/06/16 13:19

https://leetcode.com/problems/next-permutation/#/solution
思路:
从右向左单向遍历,寻找第一个a[i-1] < a[i]的位置
然后从a[i]向后找,找到一个刚好大于a[i-1]的数a[j],交换a[i-1]<->a[j]

将a[i]到结尾逆序

写代码bug连连:
考虑

1 没有找到a[i-1],则全部逆序:

2 没有妥妥找到a[j](那就是后面最小的那个数)如 1 5 8 1 7 6 5 3 2

3 在找恰好大于a[i-1]的数,注意等于号 如1 5 1

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