NC43:没有重复项数字的所有排列
没有重复项数字的所有排列
http://www.nowcoder.com/questionTerminal/4bcf3081067a4d028f95acee3ddcd2b1
解法1:利用数组记录已访问过的元素
import java.util.*;
public class Solution {
ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> permute(int[] nums) {
if (nums == null || nums.length < 1) return res;
Arrays.sort(nums);
ArrayList<Integer> list = new ArrayList<Integer>();
solve(list, nums);
return res;
}
private void solve(ArrayList<Integer> list, int[] nums) {
if (list.size() == nums.length) {
res.add(new ArrayList<Integer>(list));
return;
}
for (int i = 0; i < nums.length; i++) {
if (!list.contains(nums[i])) { //如果已经包含就不再加入---相当于剪纸啊?
list.add(nums[i]);
solve(list, nums);
list.remove(list.size() - 1);
}
}
}
}解法2:利用交换
import java.util.*;
public class Solution {
ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> permute(int[] nums) {
if (nums == null || nums.length < 1) return res;
Arrays.sort(nums);
process1(nums,0);
return res;
}
public void process1(int[] chs,int i){
if(i==chs.length){
ArrayList<Integer>list=new ArrayList<Integer>();
for(int a : chs){
list.add(a);
}
res.add(list);
return;
}
for(int j=i;j<chs.length;j++){
swap(chs,i,j);
process1(chs,i+1);
}
}
public static void swap(int[] chs, int i, int j) {
int tmp = chs[i];
chs[i] = chs[j];
chs[j] = tmp;
}
}名企高频面试算法题解 文章被收录于专栏
牛客题霸 - 程序员面试高频题 - 题解

