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;
    }
}
名企高频面试算法题解 文章被收录于专栏

牛客题霸 - 程序员面试高频题 - 题解

全部评论

相关推荐

11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务