給出一個數組,數組中的元素各不相同,找到該集合的所有子集(包括空集和本身)
舉例說明:
int []nums={1,2,3}
返回結果如下:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
使用回溯法解決上述問題。
相當於對一棵樹的深度遍歷操作。
上述的輸出結果還是有些規律的,也就是按照子集的元素個數來進行分解,元素個數為0,元素個數為1,元素個數為2,元素個數為3.
list.add(new ArrayList<>(tempList)); for(int i = startLen ; i < len ; i++){ tempList.add(nums[i]); getSubset(list,tempList,i+1,nums,len); tempList.remove(tempList.size()-1); }
關鍵代碼段如上所示。為了以后遇到這樣的題目更順手,把這道題舉一個比較詳細的計算過程
private static void getSubset(List<List<Integer>> list, List<Integer> tempList, int startLen, int[] nums, int len)
上面為函數體。
其中第一個參數類型為List<List<Integer>> list用來保存所有的子集,作為最終的輸出結果。
第二個參數為List<Integer> tempList用來記錄某一個子集,
第三個參數為int startLen 用來標記開始的長度
第四個參數為int[] nums也就是最原始的集合
第五個參數為int len 表示數組nums的長度,可以避免在循環體中不斷對數組nums進行求取長度。

參考代碼
package leetcode_100; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /*** * * @author pengfei_zheng * 求集合的所有子集 */ public class Solution78 { public static List<List<Integer>> subsets(int[] nums) { List<List<Integer>> list = new ArrayList<>();//record the final answer List<Integer> tempList = new ArrayList<>();//record one of the subSet Arrays.sort(nums); int len = nums.length;//prevent calculating the length in the function getSubset(list, tempList, 0, nums, len);//calling the backtrack function return list; } private static void getSubset(List<List<Integer>> list, List<Integer> tempList, int startLen, int[] nums, int len) { list.add(new ArrayList<>(tempList));//by calling itself to add tempList to the list for(int i = startLen ; i < len ; i++){ tempList.add(nums[i]);// add element to tempList getSubset(list,tempList,i+1,nums,len);//calling itself tempList.remove(tempList.size()-1);//backtrack and remove the top element in tempList } } public static void main(String[]args){ int []nums = {0,1,2,3}; List<List<Integer>> list = subsets(nums); int len = list.size(); for(int i = 0 ; i < len; i++){ System.out.println(list.get(i)); } } }