您的位置:首页 > 其它

LeetCode 46 Permutations + LeetCode 47 Permutations II

2017-05-25 19:21 711 查看
题意:

给出一串(46题)不重复or(47题)有重复的数字,要求输出所有排列。

思路:

有没有重复不影响思路 = =。 代码展示为46题提交结果,47题一样过……

可以偷懒用next_permutation方法也可以自己实现,实现方法为从后往前找第一个出现的nums[i] < nums[i+1],从i后面找出比nums[i]稍大一点的数字nums[x],交换nums[i]和nums[x],反序i后面的部分。

代码:

/**
* 自己实现 13ms
*/

class Solution {
public:
vector<vector<int>> permute(vector<int> &nums) {
vector<vector<int>> ans;
sort(nums.begin(), nums.end());
ans.push_back(nums);
for (;;) {
int id = -1;
for (int i = nums.size() - 1; i > 0; --i) {
if (nums[i] > nums[i - 1]) {
id = i - 1;
break;
}
}
if (id == -1) {
break;
}
for (int i = nums.size() - 1;; --i) {
if (nums[i] > nums[id]) {
swap(nums[i], nums[id]);
reverse(nums.begin() + id + 1, nums.end());
break;
}
}
ans.push_back(nums);
}
return ans;
}
};

/**
* 偷懒用next_permutation 19ms
*/

class Solution {
public:
vector<vector<int>> permute(vector<int> &nums) {
vector<vector<int>> ans;
sort(nums.begin(), nums.end());
ans.push_back(nums);
while (next_permutation(nums.begin(), nums.end())) {
ans.push_back(nums);
}
return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: