做完了字符全排列后又来道数字全排列?没错,这道题是数字全排列,给你一个数组,数组里面的元素不同,问这些数字有多少种组合方式。这道题的题目比较直观,很容易理解,于是我们也就可以更容易的去思考解题方案了。
毫无悬念,这道题用递归解答比较容易吧?其思想是:分别将某一个数字当做一个独立单位;然后不断将剩下的数字当做单独的单位按次序加入进来;递归回来后与其后面的数字交换顺序然后重复操作;最后就可以得出全排列了。
这样的递归思想确实不好描述,大家看看代码吧,看了以后就比较清晰了:
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); } } };最后结果如下(为了说明程序的正确性):