LeetCode 78 Subsets (所有子集)


 
給出一個數組,數組中的元素各不相同,找到該集合的所有子集(包括空集和本身)
舉例說明:
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));
        }
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM