【备战春招】算法学习-第四天

108 阅读1分钟

46. 全排列 - 力扣(LeetCode) (leetcode-cn.com) 47. 全排列 II - 力扣(LeetCode) (leetcode-cn.com)

1.全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

输入: nums = [1,2,3]
输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

经典入门题了,有些公司让3分钟写出来。回溯思想,我这个删除的方式笨了一点,正常人的思路是写一个 int[] visited = new int[nums.length];做备忘录。

class Solution {
    List<List<Integer>> res=new ArrayList<List<Integer>>();
    List<Integer> list=new ArrayList<Integer>();
    int len=0;
    public List<List<Integer>> permute(int[] nums) {
        len=nums.length;
        getRes(nums,len);
        return res;
    }
    public void getRes(int[] nums,int len){
        if(list.size()==len){
            res.add(new ArrayList<Integer>(list));
        }
        for(int i=0;i<nums.length;i++){
            list.add(nums[i]); 
            getRes(remove(nums,nums[i]),len);
            list.remove(list.size()-1);
        }
    }
    public int[] remove(int[] arr,int target){
        int[] arr_new = new int[arr.length-1];
        for(int i=0, k=0;i<arr.length;i++){
            if(arr[i]!=target){
                arr_new[k]=arr[i];
                k++;
            }
        }
        return arr_new;
    }
}

2.全排列II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

输入: nums = [1,1,2]
输出:
[[1,1,2],
 [1,2,1],
 [2,1,1]]

同样是回溯思想,这次加个备忘录。

class Solution {
    boolean[] vis;
    List<List<Integer>> ans = new ArrayList<List<Integer>>();
    List<Integer> perm = new ArrayList<Integer>();

    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums);
        vis=new boolean[nums.length];
        backtrack(nums,nums.length);
        return ans;
    }

    public void backtrack(int[] nums, int len) {
        if (perm.size()==len) {
            ans.add(new ArrayList(perm));
            return;
        }
        for (int i = 0; i < nums.length; ++i) {
            if (vis[i] || (i > 0 && nums[i] == nums[i - 1] && !vis[i - 1])) {
                continue;
            }
            perm.add(nums[i]);
            vis[i] = true;
            backtrack(nums,len);
            vis[i] = false;
            perm.remove(perm.size()-1);
        }
    }
}