LeetCode46 47 matriz completa

Leetcode 46 devuelve todas las combinaciones posibles
Inserte la descripción de la imagen aquí
para una colección de números no repetidos para encontrar la disposición completa de una matriz. Para el índice de subíndice de la matriz (0 ~ arr.length-1), debemos considerar colocar cada número en la matriz en el condición del subíndice.

public class Permutations {
    
    
    public static List<List<Integer>> permute(int[] nums) {
    
    
        List<List<Integer>> result = new LinkedList<>();
        helper(nums, 0, result);
        return result;
    }

    private static void helper(int[] nums, int index, List<List<Integer>> result) {
    
    
        if (index == nums.length) {
    
    
            List<Integer> list = new LinkedList<>();
            Arrays.stream(nums).forEach(list::add);
            result.add(list);
            return;
        }
        for (int i = index; i < nums.length; i++) {
    
    
            // 将其他位置的数字放置到数组的index下标处
            swap(nums, i, index);
            // 递归交换数字到其它下标处
            helper(nums, index + 1, result);
            // 将数组恢复为原始的状态,进行下一次交换
            swap(nums, i, index);
        }
    }

    private static void swap(int[] nums, int i, int j) {
    
    
        int temp = nums[j];
        nums[j] = nums[i];
        nums[i] = temp;
    }
}

Leetcode 47
Inserte la descripción de la imagen aquí
tiene elementos repetidos, necesitamos determinar si el elemento se ha colocado en esta posición antes de intercambiar elementos del elemento. Si se ha colocado, no se colocará más. La siguiente función isPlaced () juega ese papel.

class Solution {
    
    
    public static List<List<Integer>> permuteUnique(int[] nums) {
    
    
        List<List<Integer>> result = new LinkedList<>();
        helper(nums, 0, result);
        return result;
    }

    private static void helper(int[] nums, int index, List<List<Integer>> result) {
    
    
        if (index == nums.length) {
    
    
            List<Integer> list = new LinkedList<>();
            Arrays.stream(nums).forEach(list::add);
            result.add(list);
            return;
        }
        for (int i = index; i < nums.length; i++) {
    
    
            if (isPlaced(nums,index,i)) {
    
    
                continue;
            }
            swap(nums, i, index);
            // 其实这里不用添加,index等于size的时候nums中就是最终结果
            helper(nums, index + 1, result);
            swap(nums, i, index);
        }
    }


    private static boolean isPlaced(int[] nums, int start, int end) {
    
    
    // 如果在end下标之前存在一个和end相同的元素,那么在start位置是已经防止过了的,我们就不再放置
        for (int i = start; i < end; i++) {
    
    
            if (nums[i] == nums[end])//当前元素已经是重复元素
                return true;
        }
        return false;
    }

    private static void swap(int[] nums, int i, int j) {
    
    
        int temp = nums[j];
        nums[j] = nums[i];
        nums[i] = temp;
    }

    public static void main(String[] args) {
    
    
        System.out.println(permuteUnique(new int[]{
    
    1, 0, 0, 0, 9}));
    }
}

Supongo que te gusta

Origin blog.csdn.net/liu_12345_liu/article/details/104105669
Recomendado
Clasificación