给定不同数字的集合,返回所有可能的排列。

来源:互联网 发布:淘宝企业店铺开店新规 编辑:程序博客网 时间:2024/05/21 20:25

本题源自leetcode   46

---------------------------------------------------------------------------

思路:回溯法

1 对数组排序,2定义回溯函数   3   定义递归结束条件,即起始位置大于等于数组大小。 4 每次交换俩个数,递归后在交换回来,保证下次递归。

代码

 vector<vector<int>> permute(vector<int>& nums)  {        vector<vector<int>> res;        int n = nums.size();        if(n == 0)            return res;        sort(nums.begin(),nums.end());        backPath(nums,res,0);        return res;            }    void backPath(vector<int>& nums,vector<vector<int>>& res,int start){        if(nums.size() <= start){            res.push_back(nums);            return;        }        for(int i = start; i < nums.size(); i++){            swap(nums[start],nums[i]);            backPath(nums,res,start + 1);            swap(nums[start],nums[i]);        }    }

2 给定可能包含重复的数字的集合,返回所有可能的唯一排列。

去重复,只交换一次

代码:

 void recursion(vector<int> num, int start, vector<vector<int> > &res) {        if (start == num.size()) {            res.push_back(num);            return;        }        for (int k = start; k < num.size(); k++) {            if (start != k && num[start] == num[k])                 continue;            swap(num[start], num[k]);            recursion(num, start+1, res);        }    }    vector<vector<int> > permuteUnique(vector<int> &num) {        sort(num.begin(), num.end());        vector<vector<int> >res;        recursion(num, 0, res);        return res;    }

思路2

 void recursion(vector<int> nums, int start, vector<vector<int> > &res) {        if (start == nums.size()) {            res.push_back(nums);            return;        }        unordered_set<int> mp;         for (int k = start; k < nums.size(); k++) {            if(mp.count(nums[k]) > 0)                continue;            mp.insert(nums[k]);            swap(nums[start], nums[k]);            recursion(nums, start+1, res);            swap(nums[start], nums[k]);        }    }    vector<vector<int> > permuteUnique(vector<int> &num) {        sort(num.begin(), num.end());        vector<vector<int> >res;        recursion(num, 0, res);        return res;    }


阅读全文
0 0
原创粉丝点击