笔试题59. LeetCode OJ (46)

来源:互联网 发布:网络武侠小说排行榜 编辑:程序博客网 时间:2024/06/17 07:43

       做完了字符全排列后又来道数字全排列?没错,这道题是数字全排列,给你一个数组,数组里面的元素不同,问这些数字有多少种组合方式。这道题的题目比较直观,很容易理解,于是我们也就可以更容易的去思考解题方案了。

    毫无悬念,这道题用递归解答比较容易吧?其思想是:分别将某一个数字当做一个独立单位;然后不断将剩下的数字当做单独的单位按次序加入进来;递归回来后与其后面的数字交换顺序然后重复操作;最后就可以得出全排列了。


这样的递归思想确实不好描述,大家看看代码吧,看了以后就比较清晰了:

class Solution {public:vector<vector<int>> permute(vector<int>& nums){vector<vector<int>> ret;ret.clear();if (nums.size() == 0){//return ret;}else if (nums.size() == 1){vector<int> tmp;tmp.push_back(nums[0]);ret.push_back(tmp);//return ret;}else{solves(ret, nums, 0);}return ret;}void solves(vector<vector<int>>& ret, vector<int>nums, int index){if (index > nums.size()){return;}else if (index + 1 == nums.size() || index == nums.size()){vector<int> tmp;for (int i = 0; i < nums.size(); ++i){tmp.push_back(nums[i]);}ret.push_back(tmp);return;}//从 index 位置开始,依次交换位置(位置相同的不用交换)并递归int begin = index;for (int i = index; i < nums.size(); ++i){if (i != begin){swap(nums[begin], nums[i]);}solves(ret, nums, index + 1);}}};
最后结果如下(为了说明程序的正确性):


0 0
原创粉丝点击