字节面试二面算法题。
题目:求无重复数组的求排列。
思路
是由dfs算法,每次从数组中取出一个没有被取出的数(即f[i] == 0),但取出所有数时,得到一种排列方式。
回溯时,还原f[i] 的状态,删除当前列表中的最后的元素。
代码
package com.STILLxjy.codedance;
import java.util.ArrayList;
import java.util.List;
public class permute {
public static void main(String[] args) {
int[] a = new int[]{1,2,3};
List<List<Integer>> ans = permute(a);
for(int i=0;i<ans.size();i++) {
for(int j=0;j<ans.get(i).size();j++) {
System.out.print(ans.get(i).get(j) + " ");
}
System.out.println();
}
}
public static List<List<Integer>> permute(int[] nums) {
int n = nums.length;
int[] f = new int[n];
for(int i=0;i<n;i++) f[i] = 0;
List<Integer> cur = new ArrayList<Integer>();
List<List<Integer>> ans = new ArrayList<List<Integer> >();
dfs(nums, cur, ans, f, n);
return ans;
}
public static void dfs(int[] nums, List<Integer> cur, List<List<Integer>> ans, int[] f, int n){
if(cur.size() >= n) {
ans.add(new ArrayList<Integer>(cur));
return;
}
for(int i=0;i<n;i++) {
if(f[i] == 0) {
cur.add(nums[i]);
f[i] = 1;
dfs(nums, cur, ans, f, n);
cur.remove(cur.size()-1);
f[i] = 0;
}
}
}
}