题目
Given a collection of numbers, return all possible permutations.
For example,
[1,2,3]
have the following permutations:
[1,2,3]
, [1,3,2]
, [2,1,3]
, [2,3,1]
, [3,1,2]
, and [3,2,1]
.
思路:递归
class Solution {
public:
vector<vector<int> > permute(vector<int> &num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int> > result;
myfun(result,num,0);
return result;
}
void myfun(vector<vector<int> > &result, vector<int> &num, int k)
{
if(k==num.size()-1)
result.push_back(num);
else
{
for(int i=k;i<num.size();i++)
{
int tmp = num[i];
num[i] = num[k];
num[k] = tmp;
myfun(result,num,k+1);
tmp = num[i];
num[i] = num[k];
num[k] = tmp;
}
}
}
};
如果元素有重复,则需要加入判断才可以,往下递归。
class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int> > result;
myfun(result,num,0);
return result;
}
void myfun(vector<vector<int> > &result, vector<int> &num, int k)
{
if(k==num.size()-1)
result.push_back(num);
else
{
for(int i=k;i<num.size();i++)
{
if(isunique(num,k,i))
{
int tmp = num[i];
num[i] = num[k];
num[k] = tmp;
myfun(result,num,k+1);
tmp = num[i];
num[i] = num[k];
num[k] = tmp;
}
}
}
}
bool isunique(vector<int> &num, int k,int i)
{
for(int j=k;j<i;j++)
if(num[j]==num[i])
return false;
return true;
}
};
最新 java
public class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(nums.length == 0){
return result;
}
permute(nums, 0, result);
return result;
}
public void permute(int[] nums, int cur, List<List<Integer>> result) {
if(cur >= nums.length){
List<Integer> list = convertArrayToList(nums);
result.add(list);
}
for(int i=cur; i<nums.length; i++){
if(!isuniq(nums, cur, i)){
continue;
}
int temp = nums[cur];
nums[cur] = nums[i];
nums[i] = temp;
permute(nums, cur+1, result);
temp = nums[cur];
nums[cur] = nums[i];
nums[i] = temp;
}
}
private ArrayList<Integer> convertArrayToList(int[] num) {
ArrayList<Integer> item = new ArrayList<Integer>();
for (int h = 0; h < num.length; h++) {
item.add(num[h]);
}
return item;
}
private boolean isuniq(int[] nums, int from, int to){
for(int i=from; i<to; i++){
if(nums[i] == nums[to]){
return false;
}
}
return true;
}
}
我也试过其他的思路,但是都失败了。
class Solution {
public:
vector<vector<int> > permute(vector<int> &num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int> > result;
bool flag = true;
result.push_back(num);
int i=0;
for(int i=1;i<num.size()-1;i++)
{
for(int j=0;j<num.size()-i;j++)
{
int tmp = num[j];
num[j] = num[j+i];
num[j+i] = tmp;
result.push_back(num);
tmp = num[j];
num[j] = num[j+i];
num[j+i] = tmp;
}
}
return result;
}
};
上述迭代遍历的代码对于
[1,2,3] 返回结果是 | [[1,2,3],[2,1,3],[2,3,1],[1,3,2]] 而真实结果是 | [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] |