leetcode46.Permutation
Posted 妖域大都督
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode46.Permutation相关的知识,希望对你有一定的参考价值。
问题描述:
Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
思路:
本题中给出的数组中不包含重复数组,所以相对简单。
可以使用DFS来寻找,同时使用visited数组进行辅助。
代码:
class Solution { public: void permuteDFS(vector<int> &pm, vector<int> &visited, vector<vector<int>> &res, vector<int> &num){ if(pm.size() == num.size()){ res.push_back(pm); return; } for(int i = 0; i < num.size(); i++){ if(visited[i]) continue; visited[i] = 1; pm.push_back(num[i]); permuteDFS(pm, visited, res, num); pm.pop_back(); visited[i] = 0; } } vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> ret; vector<int> pm; vector<int> visited(nums.size(), 0); for(int i = 0; i < nums.size(); i++){ visited[i] = 1; pm.push_back(nums[i]); permuteDFS(pm, visited, ret, nums); pm.pop_back(); visited[i] = 0; } return ret; } };
另一种思路:
在别的大神那里看到了一种用swap的很巧妙的方法
假设nums为{1, 2, 3}
从第一个位置开始,我们找第一个位置是1的所有可能, 第一个位置是二的所有可能,第一个位置是三的所有可能
当第一个位置确定之后,我们可以去找第二个位置确定的所有可能。
依次递归。
代码:
class Solution { public: void findPermute(vector<int>& nums, vector<vector<int>> &ret, int start){ if(start == nums.size()){ ret.push_back(nums); return; } for(int i = start; i< nums.size(); i++){ swap(nums[start],nums[i]); findPermute(nums, ret, start+1); swap(nums[start],nums[i]); } } vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> ret; findPermute(nums, ret, 0); return ret; } };
以上是关于leetcode46.Permutation的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode-面试算法经典-Java实现106-Construct Binary Tree from Inorder and Postorder Traversal(构造二叉树II)(示例(代码片
LeetCode 5276. 不浪费原料的汉堡制作方案 Number of Burgers with No Waste of Ingredients