import java.util.*; public class Solution { ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); public ArrayList<ArrayList<Integer>> subsets(int[] S) { ArrayList<Integer> list = new ArrayList<Integer>(); Arrays.sort(S); for (int i = 0; i <= S.length; i++) { backTracing(i, 0, S, list); } return result; } // 如:1234 结果应该是 // 1:k= 0表示增加: [] // 2:k= 1 start=0表示增加: [1] [2] [3] [4] // 3:k= 2表示先增加[1],然后在[1]的基础上分别增加[2],[3],[4],结果: [1,2] [1,3] [1,4] // 4:k= 3表示先增加[1],然后在上一步的结果再针对 [1,2] [1,3] [1,4] 中的[1,2]添加3,4 [1,2,3],[1,2,4], 再给[1,3]追加4 [1,3,4] // 5:k= 4表示增加: 针对[1,2,3]追加4,[1,2,3,4] // 可以看出 每次都是在原有的集合的基础上 增加后面的每一个元素 组成一个新的子集合 如果当前元素后面没有元素了,那么不会被添加到result里面,会被list.remove回溯删除掉 // k就表示 为list追加几个元素 public void backTracing (int k, int start, int[] arr, ArrayList<Integer> list) { if (k == 0) { result.add(new ArrayList(list)); return; } for (int j = start; j < arr.length; j++) { list.add(arr[j]); backTracing(k - 1, j + 1, arr, list); list.remove(list.size() - 1); } } }