From d58fe4ea60f314dd4a9ffdd41beadc4710369ba7 Mon Sep 17 00:00:00 2001 From: Kai Dang <15596570256@163.com> Date: Fri, 31 Dec 2021 17:04:46 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200040.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8CII.md=20=E4=B8=AD=E7=9A=84Java?= =?UTF-8?q?=E4=B8=8EGo=E7=9A=84=E4=B8=8D=E4=BD=BF=E7=94=A8=E6=A0=87?= =?UTF-8?q?=E8=AE=B0=E6=95=B0=E7=BB=84=E7=9A=84=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0040.组合总和II.md | 76 ++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/problems/0040.组合总和II.md b/problems/0040.组合总和II.md index 31011ed6..5d9e4965 100644 --- a/problems/0040.组合总和II.md +++ b/problems/0040.组合总和II.md @@ -255,6 +255,7 @@ public: ## Java +**使用标记数组** ```Java class Solution { List> lists = new ArrayList<>(); @@ -292,6 +293,44 @@ class Solution { } } ``` +**不使用标记数组** +```Java +class Solution { + List> res = new ArrayList<>(); + LinkedList path = new LinkedList<>(); + int sum = 0; + + public List> combinationSum2( int[] candidates, int target ) { + //为了将重复的数字都放到一起,所以先进行排序 + Arrays.sort( candidates ); + backTracking( candidates, target, 0 ); + return res; + } + + private void backTracking( int[] candidates, int target, int start ) { + if ( sum == target ) { + res.add( new ArrayList<>( path ) ); + return; + } + for ( int i = start; i < candidates.length && sum + candidates[i] <= target; i++ ) { + //正确剔除重复解的办法 + //跳过同一树层使用过的元素 + if ( i > start && candidates[i] == candidates[i - 1] ) { + continue; + } + + sum += candidates[i]; + path.add( candidates[i] ); + // i+1 代表当前组内元素只选取一次 + backTracking( candidates, target, i + 1 ); + + int temp = path.getLast(); + sum -= temp; + path.removeLast(); + } + } +} +``` ## Python **回溯+巧妙去重(省去使用used** @@ -384,6 +423,7 @@ class Solution: ## Go 主要在于如何在回溯中去重 +**使用used数组** ```go func combinationSum2(candidates []int, target int) [][]int { var trcak []int @@ -423,7 +463,41 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int, } } ``` - +**不使用used数组** +```go +func combinationSum2(candidates []int, target int) [][]int { + var trcak []int + var res [][]int + sort.Ints(candidates) + backtracking(0,0,target,candidates,trcak,&res) + return res +} +func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int){ + //终止条件 + if sum==target{ + tmp:=make([]int,len(trcak)) + //拷贝 + copy(tmp,trcak) + //放入结果集 + *res=append(*res,tmp) + return + } + //回溯 + for i:=startIndex;istartIndex&&candidates[i]==candidates[i-1]{ + continue + } + //更新路径集合和sum + trcak=append(trcak,candidates[i]) + sum+=candidates[i] + backtracking(i+1,sum,target,candidates,trcak,res) + //回溯 + trcak=trcak[:len(trcak)-1] + sum-=candidates[i] + } +} +``` ## javaScript ```js From 46ceb72cd01b08f6a734ca87d329c56ec51a51e6 Mon Sep 17 00:00:00 2001 From: erdengk <15596570256@163.com> Date: Sun, 2 Jan 2022 11:21:56 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200090.=E5=AD=90?= =?UTF-8?q?=E9=9B=86II.md=20=E4=B8=AD=E7=9A=84Java=E4=B8=8D=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=A0=87=E8=AE=B0=E6=95=B0=E7=BB=84=E7=9A=84=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0090.子集II.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/problems/0090.子集II.md b/problems/0090.子集II.md index 5b92517a..a1e86464 100644 --- a/problems/0090.子集II.md +++ b/problems/0090.子集II.md @@ -166,7 +166,7 @@ if (i > startIndex && nums[i] == nums[i - 1] ) { ### Java - +使用used数组 ```java class Solution { List> result = new ArrayList<>();// 存放符合条件结果的集合 @@ -202,6 +202,37 @@ class Solution { } ``` +不使用used数组 +```java +class Solution { + + List> res = new ArrayList<>(); + LinkedList path = new LinkedList<>(); + + public List> subsetsWithDup( int[] nums ) { + Arrays.sort( nums ); + subsetsWithDupHelper( nums, 0 ); + return res; + } + + + private void subsetsWithDupHelper( int[] nums, int start ) { + res.add( new ArrayList<>( path ) ); + + for ( int i = start; i < nums.length; i++ ) { + // 跳过当前树层使用过的、相同的元素 + if ( i > start && nums[i - 1] == nums[i] ) { + continue; + } + path.add( nums[i] ); + subsetsWithDupHelper( nums, i + 1 ); + path.removeLast(); + } + } + +} +``` + ### Python ```python class Solution: