笔试题59. LeetCode OJ (46)

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

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


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

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);
		}
	}
};
最后结果如下(为了说明程序的正确性):

笔试题59. LeetCode OJ (46)_第1张图片

你可能感兴趣的:(LeetCode,C++,算法)