package LeetCode.backtrackpart05; import java.util.ArrayList; import java.util.List; /** * 491. 递增子序列 * 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。 * 你可以按 任意顺序 返回答案。 * 数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。 * 示例: * 输入:nums = [4,6,7,7] * 输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]] * */ public class NonDecreasingSubsequences_491 { public static List<Integer> path = new ArrayList<>(); public static List<List<Integer>> res = new ArrayList<>(); public static void main(String[] args) { int [] nums = {4,6,7,7}; res = findSubsequences(nums); System.out.println(res); } public static List<List<Integer>> findSubsequences(int [] nums){ backtracking(nums,0); return res; } public static void backtracking(int [] nums,int startIndex){ // 题目要求:子序列中至少有两个元素 if (path.size() > 1){ res.add(new ArrayList<>(path)); } int [] used = new int[201]; for (int i = startIndex; i < nums.length; i++) { if (!path.isEmpty() && nums[i] < path.get(path.size() - 1) || (used[nums[i] + 100] == 1)) { continue; } used[nums[i] + 100] = 1; path.add(nums[i]); backtracking(nums, i + 1); path.remove(path.size() - 1); } } }
package LeetCode.backtrackpart05; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; /** * 46. 全排列 * 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 * 示例: * 输入:nums = [1,2,3] * 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] * */ public class Permutations_46 { public static List<List<Integer>> result = new ArrayList<>();// 存放符合条件结果的集合 public static LinkedList<Integer> path = new LinkedList<>();// 用来存放符合条件结果 public static boolean[] used; public static void main(String[] args) { int [] nums = {1,2,3}; result = permute(nums); System.out.println(result); } public static List<List<Integer>> permute(int[] nums) { if (nums.length == 0){ return result; } used = new boolean[nums.length]; permuteHelper(nums); return result; } public static void permuteHelper(int[] nums){ if (path.size() == nums.length){ result.add(new ArrayList<>(path)); return; } for (int i = 0; i < nums.length; i++){ if (used[i]){ continue; } used[i] = true; path.add(nums[i]); permuteHelper(nums); path.removeLast(); used[i] = false; } } }
package LeetCode.backtrackpart05; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; /** * 47. 全排列 II * 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 * 示例: * 输入:nums = [1,2,3] * 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] * */ public class PermutationsII_47 { public static List<List<Integer>> result = new ArrayList<>();// 存放符合条件结果的集合 public static LinkedList<Integer> path = new LinkedList<>();// 用来存放符合条件结果 public static void main(String[] args) { int [] nums = {1,2,3}; result = permuteUnique(nums); System.out.println(result); } public static List<List<Integer>> permuteUnique(int[] nums) { boolean[] used = new boolean[nums.length]; Arrays.fill(used, false); Arrays.sort(nums); backtracking(nums, used); return result; } public static void backtracking(int [] nums,boolean [] used){ if (path.size() == nums.length) { result.add(new ArrayList<>(path)); return; } for (int i = 0; i < nums.length; i++) { // used[i - 1] == true,说明同⼀树⽀nums[i - 1]使⽤过 // used[i - 1] == false,说明同⼀树层nums[i - 1]使⽤过 // 如果同⼀树层nums[i - 1]使⽤过则直接跳过 if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) { continue; } //如果同⼀树⽀nums[i]没使⽤过开始处理 if (used[i] == false) { used[i] = true;//标记同⼀树⽀nums[i]使⽤过,防止同一树枝重复使用 path.add(nums[i]); backtracking(nums, used); path.remove(path.size() - 1);//回溯,说明同⼀树层nums[i]使⽤过,防止下一树层重复 used[i] = false;//回溯 } } } }
标签:used,day29,nums,46,47,int,static,path,public From: https://www.cnblogs.com/lipinbigdata/p/17441809.html