您的位置:首页 > 其它

[LeetCode] 31. Next Permutation

2017-07-25 11:29 281 查看
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());

}
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: