刷题顺序按照代码随想录建议
题目描述
英文版描述
Given an integer array nums
of unique elements, return all possible
subsets
(the power set) .
The solution set must not contain duplicate subsets. Return the solution in any order.
Example 1:
Input: nums = [1,2,3] Output: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
Example 2:
Input: nums = [0] Output: [[],[0]]
Constraints:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
- All the numbers of
nums
are unique.
英文版地址
中文版描述
给你一个整数数组 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
中的所有元素 互不相同
中文版地址
解题方法
递归法
java
class Solution {
List<List<Integer>> result = new ArrayList<>();
List<Integer> level = new ArrayList<>();
/**
* 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
* 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
* <p>
* 示例 1:
* 输入:nums = [1,2,3]
* 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
*
* @param nums
* @return
*/
public List<List<Integer>> subsets(int[] nums) {
backTracking(nums, 0);
return result;
}
private void backTracking(int[] nums, int startIndex) {
result.add(new ArrayList<>(level));
for (int i = startIndex; i < nums.length; i++) {
level.add(nums[i]);
backTracking(nums, i + 1);
level.remove(level.size() - 1);
}
}
}
复杂度分析
- 时间复杂度:O(n×2^n),一共 2^n个状态,每种状态需要 O(n)的时间来构造子集
- 空间复杂度:O(n),临时List的空间代价是 O(n),递归时栈空间的代价为 O(n)