LeetCode全排列问题!(DFS)

_46_全排列

package DFS;

import java.util.ArrayList;
import java.util.List;

/**
 * https://leetcode-cn.com/problems/permutations/
 * @author Qitong!!
 * @Date 2020/6/21
 */
public class _46_全排列 {
    private List<List<Integer>> list;
    private int[] result;
    private boolean[] used;
    private int[] nums;
    public List<List<Integer>> permute(int[] nums) {
        if (nums == null)return null;
        list = new ArrayList<>();
        if (nums.length == 0 )return list;
        this.nums = nums;
        //储存 每一次的结果
        result = new int[nums.length];
        used = new boolean[nums.length];
        dfs(0);

        return list;
    }

    private void dfs(int index) {
        //到最后一层
        if (index == nums.length ){
            List<Integer> resList = new ArrayList<>();
            for (int val : result){
                resList.add(val);
            }
            list.add(resList);
        }
        //枚举每一层的可能
        for (int i = 0; i < nums.length; i++) {
            if (used[i]) continue;;
            result[index] = nums[i];
            used[i] = true;
            dfs(index+1);

            //还原现场
            used[i] = false;
        }
    }

}

_47_全排列II

包含重复数字的!!(要求输出去重)

package DFS;

import java.util.ArrayList;
import java.util.List;

/**
 * https://leetcode-cn.com/problems/permutations-ii/
 * @author Qitong!!
 * @Date 2020/6/21
 */
public class _47_全排列II {
    public List<List<Integer>> permuteUnique(int[] nums) {
        if (nums == null) return null;
        List<List<Integer>> list = new ArrayList<>();
        if (nums.length == 0) return list;
        dfs(0,nums,list);
        return list;
    }

    private void dfs(int index, int[] nums, List<List<Integer>> list) {
        //到最后一层
        if (index == nums.length){
            List<Integer> res = new ArrayList<>();
            for (int val: nums){
                res.add(val);
            }
            list.add(res);
            return;
        }

        //枚举这一层可以做的选择
        for (int i = index; i < nums.length; i++) {
            //保证每一个位置只出现一次
            if (isRepeat(nums,index,i)) continue;
            swap(nums,index,i);
            dfs(index+1,nums,list);
            swap(nums,index,i);
        }
    }

    private boolean isRepeat(int[] nums, int index, int i) {
        for (int j =index; j<i ;j++){
            if (nums[j] == nums[i]) return true;
        }
        return false;
    }
    private void swap(int[] nums ,int index,int i){
        int temp = nums[index];
        nums[index] = nums[i];
        nums[i] = temp;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45399846/article/details/106997876
今日推荐