diff --git a/SubSetII/step1.md b/SubSetII/step1.md new file mode 100644 index 0000000..957dc89 --- /dev/null +++ b/SubSetII/step1.md @@ -0,0 +1,31 @@ +```java +// Backtracking +// Generate all subsets and use a map to remove duplicate +// Sort it frist, if the previous number is same with current number meaning that the subproblem of +// the current number will be already consider in the previous number. So, we skip +// It can reduce the space complextity for the map +// That will increase the time complexity but order wouldn't change because the overal time complexity will depends on biggest order(2 ** n) +// Time complexity: O(2 ** N * N(list copy)) N: number of nums +// Space complexity: O(2 ** N) result +// Time spend: 12:21 +class Solution { + public List> subsetsWithDup(int[] nums) { + Arrays.sort(nums); + List> res = new ArrayList<>(); + backtrack(res, new ArrayList<>(), nums, 0); + return res; + } + + private void backtrack(List> res, List tempList, int[] nums, int start) { + res.add(new ArrayList<>(tempList)); + for (int i = start; i < nums.length; i++) { + if (i > start && nums[i] == nums[i - 1]) { + continue; + } + tempList.add(nums[i]); + backtrack(res, tempList, nums, i + 1); + tempList.remove(tempList.size() - 1); + } + } +} +``` \ No newline at end of file diff --git a/SubSetII/step2.md b/SubSetII/step2.md new file mode 100644 index 0000000..c45fc56 --- /dev/null +++ b/SubSetII/step2.md @@ -0,0 +1,23 @@ +```java +// Time spend: 02:14 +class Solution { + public List> subsetsWithDup(int[] nums) { + Arrays.sort(nums); + List> res = new ArrayList<>(); + backtrack(res, new ArrayList<>(), nums, 0); + return res; + } + + private void backtrack(List> res, List tempList, int[] nums, int start) { + res.add(new ArrayList<>(tempList)); + for (int i = start; i < nums.length; i++) { + if (i > start && nums[i] == nums[i - 1]) { + continue; + } + tempList.add(nums[i]); + backtrack(res, tempList, nums, i + 1); + tempList.remove(tempList.size() - 1); + } + } +} +``` \ No newline at end of file diff --git a/SubSetII/step3.md b/SubSetII/step3.md new file mode 100644 index 0000000..f2e4427 --- /dev/null +++ b/SubSetII/step3.md @@ -0,0 +1,71 @@ +```java +// Time spend: 02:01 +class Solution { + public List> subsetsWithDup(int[] nums) { + Arrays.sort(nums); + List> res = new ArrayList<>(); + backtrack(res, new ArrayList<>(), nums, 0); + return res; + } + + private void backtrack(List> res, List tempList, int[] nums, int start) { + res.add(new ArrayList<>(tempList)); + for (int i = start; i < nums.length; i++) { + if (i > start && nums[i] == nums[i - 1]) { + continue; + } + tempList.add(nums[i]); + backtrack(res, tempList, nums, i + 1); + tempList.remove(tempList.size() - 1); + } + } +} +``` + +```java +// Time spend: 01:58 +class Solution { + public List> subsetsWithDup(int[] nums) { + Arrays.sort(nums); + List> res = new ArrayList<>(); + backtrack(res, new ArrayList<>(), nums, 0); + return res; + } + + private void backtrack(List> res, List tempList, int[] nums, int start) { + res.add(new ArrayList<>(tempList)); + for (int i = start; i < nums.length; i++) { + if (i > start && nums[i] == nums[i - 1]) { + continue; + } + tempList.add(nums[i]); + backtrack(res, tempList, nums, i + 1); + tempList.remove(tempList.size() - 1); + } + } +} +``` + +```java +// Time spend: 01:53 +class Solution { + public List> subsetsWithDup(int[] nums) { + Arrays.sort(nums); + List> res = new ArrayList<>(); + backtrack(res, new ArrayList<>(), nums, 0); + return res; + } + + private void backtrack(List> res, List tempList, int[] nums, int start) { + res.add(new ArrayList<>(tempList)); + for (int i = start; i < nums.length; i++) { + if (i > start && nums[i] == nums[i - 1]) { + continue; + } + tempList.add(nums[i]); + backtrack(res, tempList, nums, i + 1); + tempList.remove(tempList.size() - 1); + } + } +} +``` \ No newline at end of file