LeetCode 78. Subsets
原题链接在这里:https://leetcode.com/problems/subsets/
题目:
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3] Output: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
题解:
Set state on each level. What are needed for the state.
Here it needs to know index and current item.
Time Complexity: exponential.
Space: O(nums.length). stack space.
AC Java:
1 class Solution { 2 public List<List<Integer>> subsets(int[] nums) { 3 List<List<Integer>> res = new ArrayList<List<Integer>>(); 4 Arrays.sort(nums); 5 dfs(nums, 0, new ArrayList<Integer>(), res); 6 return res; 7 } 8 9 private void dfs(int [] nums, int start, List<Integer> item, List<List<Integer>> res){ 10 res.add(new ArrayList<Integer>(item)); 11 for(int i = start; i<nums.length; i++){ 12 item.add(nums[i]); 13 dfs(nums, i+1, item, res); 14 item.remove(item.size()-1); 15 } 16 } 17 }
AC Python:
class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: res = [] self.dfs(nums, [], res) return res def dfs(self, nums: List[int], item: List[int], res: List[List[int]]) -> None: res.append(item) for i in range(len(nums)): self.dfs(nums[i+1:], item + [nums[i]], res)
Iteration时, 取res中现有list,每个list都加新的元素nums[i]然后再放回res中,同时保留原有list. 从[]开始一次加一个新元素。
Note: 内层for loop 的size 一定要提前提取出来,不能在内层for中现提取,因为res的size一直在变.
Time Complexity: exponential. Space: O(res.size()).
AC Java:
1 class Solution { 2 public List<List<Integer>> subsets(int[] nums) { 3 List<List<Integer>> res = new ArrayList<>(); 4 res.add(new ArrayList<Integer>()); 5 for(int num : nums){ 6 //这里要注意,必须提前把size提取出来,不能把提取过程直接嵌入到下面的for语句中 7 //因为res的size会在下面语句中一直变化 8 int size = res.size(); 9 for(int i = 0; i<size; i++){ 10 List<Integer> copyItem = new ArrayList<Integer>(res.get(i)); 11 copyItem.add(num); 12 res.add(copyItem); 13 } 14 } 15 16 return res; 17 } 18 }
AC Python:
class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: res = [[]] for num in nums: for i in range(len(res)): res.append(res[i] + [num]) return res
类似Combinations, Combination Sum, Palindrome Partitioning, Increasing Subsequences.
进阶题是Subsets II.