Leetcode演算法Java全解答--78. 子集
阿新 • • 發佈:2018-12-26
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