1. 程式人生 > >Leetcode演算法Java全解答--78. 子集

Leetcode演算法Java全解答--78. 子集

Leetcode演算法Java全解答–78. 子集

文章目錄

題目

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。

說明:解集不能包含重複的子集。
示例:

輸入: nums = [1,2,3]
輸出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

想法

和077差不多,
回溯演算法: (後面的資料是用下標表示)以1起始資料,然後將2.3.4拼進去;
再回頭以2為起始位置,這時候就不能把1算進去,然後把3.4拼進去

結果

超過50%的測試案例

時間複雜度/空間複雜度:n/n

總結

程式碼

我的答案

public List<List<Integer>> subsets(int[] nums) {
    List<List<Integer>> ans = new ArrayList<>();

    List<Integer> cur = new ArrayList<>();

    dfs(nums, 0, cur, ans);
    return ans;
}

private void dfs(int[] nums, int last, List<Integer> cur, List<List<Integer>> ans) {
    ans.add(new ArrayList<>(cur));
    for (int i = last; i < nums.length; i++) {
        cur.add(nums[i]);
        dfs(nums, i + 1, cur, ans);
        cur.remove(cur.size() - 1);
    }
    System.out.println(ans.toString());
}


大佬們的答案

    public List<List<Integer>> better(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();

        int n = nums.length;
        for (int i = 0; i < n; i++) {
            int num = nums[i];
            List<Integer> one = new ArrayList<>();
            one.add(num);
            result.add(one);
            int resultSize = result.size();
            for (int j = 0; j < resultSize - 1; j++) {
                List<Integer> newone = new ArrayList<>();
                newone.addAll(result.get(j));
                newone.add(num);
                result.add(newone);
            }
        }
        result.add(new ArrayList<>());
        return result;
    }

測試用例

@Test
    public void test078() {
        // 建立測試案例
        int[] nums1 = new int[] { 1, 2, 3 };

        // 測試案例期望值
        List<List<Integer>> expResult1 = new ArrayList<>();
        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        List<Integer> list2 = new ArrayList<>();
        list2.add(2);
        List<Integer> list3 = new ArrayList<>();
        list3.add(3);
        List<Integer> list4 = new ArrayList<>();
        list4.add(1);
        list4.add(2);
        List<Integer> list5 = new ArrayList<>();
        list5.add(1);
        list5.add(3);
        List<Integer> list6 = new ArrayList<>();
        list6.add(2);
        list6.add(3);
        List<Integer> list7 = new ArrayList<>();
        list7.add(1);
        list7.add(2);
        list7.add(3);
        List<Integer> list8 = new ArrayList<>();
        expResult1.add(list1);
        expResult1.add(list2);
        expResult1.add(list3);
        expResult1.add(list4);
        expResult1.add(list5);
        expResult1.add(list6);
        expResult1.add(list7);
        expResult1.add(list8);

        // 執行方法
        Solution078 solution078 = new Solution078();
        List<List<Integer>> result1 = solution078.subsets(nums1);

        // 判斷期望值與實際值
        Assert.assertEquals(expResult1, result1);
    }

其他

程式碼託管碼雲地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git

檢視其他內容可以點選專欄或者我的部落格哈:https://blog.csdn.net/cmqwan

“大佬們的答案” 標籤來自leetcode,侵權請聯絡我進行刪改

如有疑問請聯絡,聯絡方式:QQ3060507060