//给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 // // 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 // // // // 示例 1: // // //输入:nums = [1,2,3] //输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]] // // // 示例 2: // // //输入:nums = [0] //输出:[[],[0]] // // // // // 提示: // // // 1 <= nums.length <= 10 // -10 <= nums[i] <= 10 // nums 中的所有元素 互不相同 // // Related Topics 位运算 数组 回溯算法 // 👍 958 👎 0 import java.util.ArrayList; import java.util.List; //leetcode submit region begin(Prohibit modification and deletion) class Solution { private List<List<Integer>> list = new ArrayList<List<Integer>>(); // public List<List<Integer>> subsets(int[] nums) { // backtrack(new ArrayList<>(), nums, 0); // return list; // } // // private void backtrack(List<Integer> tempList, int[] nums, int start) { // //走过的所有路径都是子集的一部分,所以都要加入到集合中 // list.add(new ArrayList<>(tempList)); // for (int i = start; i < nums.length; i++) { // //做出选择 // tempList.add(nums[i]); // //递归 // backtrack(tempList, nums, i + 1); // //撤销选择 // tempList.remove(tempList.size() - 1); // } // } public List<List<Integer>> subsets(int[] nums) { huisu(new ArrayList<>(), 0, nums); return list; } private void huisu(List<Integer> lu, int start, int[] nums) { //终止条件得到一个结果 list.add(new ArrayList<>(lu)); for (int i = start; i < nums.length; i++) { int num = nums[i]; //剪枝 if (!lu.contains(num)) { lu.add(num); //递归 huisu(lu, i + 1, nums); //回撤 lu.remove(lu.size() - 1); } } } } //leetcode submit region end(Prohibit modification and deletion)
2021-01-22 子集 回溯法
最新推荐文章于 2024-07-24 14:54:00 发布