一个由有限个不同元素组成的数组的所有组合排列形式。
要求排列的顺序以从小到大的顺序排列,
按首列排序,首列相同,则按照第二列排序,前两列相同,则以第三列排序,以此顺序递推。
[1,2]
[[1,2],[2,1]]
输出结果:1,22,1以首列进行排序
[1,2,3]
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
输出结果:1,2,31,3,22,1,32,3,13,1,23,2,1先排首列,首列相同,以第二列的顺序展示。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector<vector<>>
*/
void dfs(vector<int>& array, int id, set<vector<int>>& res) {
if(id==array.size()) {
res.insert(array);
return ;
}
for(int i=id;i<array.size();++i) {
int x=array[id];
array[id]=array[i];
array[i]=x;
dfs(array,id+1,res);
array[i]=array[id];
array[id]=x;
}
}
vector<vector<int> > exportAllOrders(vector<int>& array) {
//sort(array.begin(),array.end());
if(array.size()==0) {
return vector<vector<int>>{};
}
set<vector<int>> s;
vector<vector<int>> res;
dfs(array,0,s);
for(auto iter=s.begin(); iter!=s.end(); ++iter)
res.push_back(*iter);
return res;
}
}; class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型vector * @return int整型vector<vector<>> */ vector<vector<int> > exportAllOrders(vector<int>& array) { // write code here vector<vector<int> > res; if (array.size() == 0) return res; sort(array.begin(), array.end()); do { res.push_back(array); } while (next_permutation(array.begin(), array.end())); return res; } };
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型二维数组
*/
public int[][] exportAllOrders(int[] array) {
List<List<Integer>> list = permute(array);
int[][] arr = new int[list.size()][array.length];
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < array.length; j++) {
arr[i][j] = list.get(i).get(j);
}
}
return arr;
}
public List<List<Integer>> permute(int[] nums) {
int len = nums.length;
List<List<Integer>> list = new ArrayList<>();
if (len == 0) return list;
boolean[] used = new boolean[len];
List<Integer> path = new ArrayList<>();
dfs(nums, len, 0, path, used, list);
return list;
}
private void dfs(int[] nums, int len, int depth, List<Integer> path, boolean[] used, List<List<Integer>> res) {
if (depth == len) {
res.add(new ArrayList<>(path));
return;
}
for (int i = 0; i < len; i++) {
if (!used[i]) {
path.add(nums[i]);
used[i] = true;
dfs(nums, len, depth + 1, path, used, res);
used[i] = false;
path.remove(path.size() - 1);
}
}
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型二维数组
*/
public int[][] exportAllOrders (int[] array) {
// write code here
int n = array.length;
int l = getLength(n);
int[][] res = new int[l][n];
Arrays.sort(array);
List<Integer> ls = new ArrayList<>();
List<List<Integer>> list = new ArrayList<>();
Set<Integer> set = new HashSet<>();
back(array,0,ls,list,set);
for(int i=0;i<list.size();i++){
List<Integer> temp = list.get(i);
for(int j=0;j<temp.size();j++){
res[i][j] = temp.get(j);
}
}
return res;
}
public void back(int[] array, int start, List<Integer> ls, List<List<Integer>> list, Set<Integer> set){
if(ls.size()==array.length){
list.add(new ArrayList<>(ls));
return;
}
for(int i=0;i<array.length;i++){
if(!set.contains(i)){
set.add(i);
ls.add(array[i]);
back(array,start+1,ls,list,set);
set.remove(i);
ls.remove(ls.size()-1);
}else{
continue;
}
}
}
public int getLength(int n){
if(n==0){
return 0;
}
if(n==1){
return 1;
}else{
return n*getLength(n-1);
}
}
}