From ce64f93c761874d60fcae7b3bfae69a2e479eb5e Mon Sep 17 00:00:00 2001 From: zhangsan <646228430@qq.com> Date: Mon, 7 Jul 2025 18:09:17 +0800 Subject: [PATCH] =?UTF-8?q?7.7=20=E4=BA=8C=E5=88=B7=20=E5=9B=9E=E6=BA=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/backtrack/CombinationSum.java | 23 +++++++++++++ src/main/java/backtrack/CombinationSum2.java | 27 ++++++++++++++++ src/main/java/backtrack/CombinationSum3.java | 24 ++++++++++++++ src/main/java/backtrack/Exist.java | 2 ++ .../java/backtrack/GenerateParenthesis.java | 32 +++++++++++++++++++ .../java/backtrack/LetterCombinations.java | 30 +++++++++++++++++ src/main/java/backtrack/Partition.java | 3 +- src/main/java/backtrack/SubsetsWithDup.java | 17 ++++++++++ .../java/backtrack/CombinationSum3Test.java | 15 +++++++++ 9 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 src/test/java/backtrack/CombinationSum3Test.java diff --git a/src/main/java/backtrack/CombinationSum.java b/src/main/java/backtrack/CombinationSum.java index d790ac8..e37668c 100644 --- a/src/main/java/backtrack/CombinationSum.java +++ b/src/main/java/backtrack/CombinationSum.java @@ -23,7 +23,30 @@ import java.util.List; * 链接:https://leetcode.cn/problems/combination-sum/ */ +//二刷会做 public class CombinationSum { + void dfs(List> res,List path,int[] candidates,int begin,int target,int cur){ + if(cur>target)return; + else if (cur==target) { + res.add(new ArrayList<>(path)); + return; + }else { + for (int i = begin; i < candidates.length; i++) { + path.add(candidates[i]); + cur+=candidates[i]; + dfs(res,path,candidates,i,target,cur); + cur-=candidates[i]; + path.remove(path.size()-1); + } + } + } + public List> combinationSum1(int[] candidates, int target) { + List> res=new ArrayList<>(); + List path=new ArrayList<>(); + dfs(res,path,candidates,0,target,0); + return res; + } + void dfs(int[] candidates,Listpath,List>res,int start,int cur,int target){ if(cur==target) { res.add(new ArrayList<>(path)); diff --git a/src/main/java/backtrack/CombinationSum2.java b/src/main/java/backtrack/CombinationSum2.java index 108d54a..9bd52c6 100644 --- a/src/main/java/backtrack/CombinationSum2.java +++ b/src/main/java/backtrack/CombinationSum2.java @@ -26,7 +26,34 @@ import java.util.List; * 链接:https://leetcode.cn/problems/combination-sum-ii/ */ +//二刷会做 public class CombinationSum2 { + void dfs(List> res,List path,int[] candidates,int begin,int target,int cur){ + if(cur>target)return; + else if (cur==target) { + res.add(new ArrayList<>(path)); + return; + }else { + for (int i = begin; i < candidates.length; i++) { + if(i>begin&&candidates[i]==candidates[i-1])continue; + path.add(candidates[i]); + cur+=candidates[i]; + dfs(res,path,candidates,i+1,target,cur); + cur-=candidates[i]; + path.remove(path.size()-1); + } + } + } + + public List> combinationSum22(int[] candidates, int target) { + Arrays.sort(candidates); + List> res=new ArrayList<>(); + List path=new ArrayList<>(); + dfs(res,path,candidates,0,target,0); + return res; + } + + void backtrack(List>res,Listpath,int[] candidates,int[]visited,int start,int cur,int target){ if(cur==target) { res.add(new ArrayList<>(path)); diff --git a/src/main/java/backtrack/CombinationSum3.java b/src/main/java/backtrack/CombinationSum3.java index 3d6d9b5..2f5c767 100644 --- a/src/main/java/backtrack/CombinationSum3.java +++ b/src/main/java/backtrack/CombinationSum3.java @@ -19,7 +19,31 @@ import java.util.List; * 链接:https://leetcode.cn/problems/combination-sum-iii/ */ +//二刷会做 public class CombinationSum3 { + void dfs(List> res,List path,int k,int n,int cnt,int sum,int begin){ + if(cnt==k){ + if(n==sum)res.add(new ArrayList<>(path)); + }else { + for (int i = begin; i <= 9; i++) { + path.add(i); + cnt++; + sum+=i; + dfs(res,path,k,n,cnt,sum,i+1); + sum-=i; + cnt--; + path.remove(path.size()-1); + + } + } + } + public List> combinationSum33(int k, int n) { + List> res=new ArrayList<>(); + List path=new ArrayList<>(); + dfs(res,path,k,n,0,0,1); + return res; + } + void dfs(int n,int k,int used,List>res,Listpath,int cursum,int begin){ if(used==k){ if(n==cursum) diff --git a/src/main/java/backtrack/Exist.java b/src/main/java/backtrack/Exist.java index 92735b7..33be7f5 100644 --- a/src/main/java/backtrack/Exist.java +++ b/src/main/java/backtrack/Exist.java @@ -15,7 +15,9 @@ package backtrack; * 链接:https://leetcode.cn/problems/word-search/ */ +//二刷会做 public class Exist { + boolean flag = false; void dfs(char[][] board, String word, int i, int j, int index) { diff --git a/src/main/java/backtrack/GenerateParenthesis.java b/src/main/java/backtrack/GenerateParenthesis.java index 47afdf6..daa00ce 100644 --- a/src/main/java/backtrack/GenerateParenthesis.java +++ b/src/main/java/backtrack/GenerateParenthesis.java @@ -18,7 +18,39 @@ import java.util.List; * 链接:https://leetcode.cn/problems/generate-parentheses/ */ //做出来了,但我的写法很丑,改为标准答案 +//二刷不会 public class GenerateParenthesis { + + //自己写的 + class Solution { + public List generateParenthesis(int n) { + List res = new ArrayList<>(); + backtrack(res, new StringBuilder(), 0, 0, 2 * n); + return res; + } + + private void backtrack(List res, StringBuilder path, + int idx, int bias, int len) { + + if (bias < 0 || bias > len - idx) return; // 提前剪枝 当前右括号数量多或者剩余右括号不足以抵消左括号时.. + if (idx == len) { // 成功 + res.add(path.toString()); + return; + } + + int oldLen = path.length(); + + path.append('('); // 放左括号 bias+1 + backtrack(res, path, idx + 1, bias + 1, len); + path.setLength(oldLen); + + path.append(')'); // 放右括号 bias-1 + backtrack(res, path, idx + 1, bias - 1, len); + path.setLength(oldLen); + } + } + + // 回溯函数 void dfs(List res, StringBuilder path, int left, int right, int n) { // 如果左右括号都用完了,加入结果 diff --git a/src/main/java/backtrack/LetterCombinations.java b/src/main/java/backtrack/LetterCombinations.java index 4a1b167..2e00aa5 100644 --- a/src/main/java/backtrack/LetterCombinations.java +++ b/src/main/java/backtrack/LetterCombinations.java @@ -2,6 +2,7 @@ package backtrack; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * 题目: 17. 电话号码的字母组合 (letterCombinations) @@ -19,7 +20,36 @@ import java.util.List; * 链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/ */ //重做一遍 +//二刷会做 public class LetterCombinations { + void dfs(Listres,StringBuilder sb,int index,Listcur){ + if (index == cur.size()) { + res.add(sb.toString()); + return; + } + String curString= cur.get(index); + for (int i = 0; i < curString.length(); i++) { + sb.append(curString.charAt(i)); + dfs(res,sb,index+1,cur); + sb.deleteCharAt(sb.length()-1); + } + } + public List letterCombinations2(String digits) { + String[] dict={ + "abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" + }; + Listcur=new ArrayList<>(); + List res=new ArrayList<>(); + if(Objects.equals(digits, ""))return new ArrayList<>(); + for (int i = 0; i < digits.length(); i++) { + cur.add(dict[digits.charAt(i)-'2']); + } + StringBuilder sb=new StringBuilder(); + dfs(res,sb,0,cur); + return res; + } + + public List letterCombinations(String digits) { List res = new ArrayList<>(); // 如果输入为空,直接返回空结果 diff --git a/src/main/java/backtrack/Partition.java b/src/main/java/backtrack/Partition.java index fef7de6..1bad3aa 100644 --- a/src/main/java/backtrack/Partition.java +++ b/src/main/java/backtrack/Partition.java @@ -18,11 +18,12 @@ import java.util.List; * 链接:https://leetcode.cn/problems/palindrome-partitioning/ */ //不会 +//二刷不会 public class Partition { + /** * 递归与回溯: * 从字符串的起始位置开始,遍历所有可能的分割点,对于每个可能的子串,先判断它是否为回文串。 - * * 如果是回文串,则将其加入当前的分割方案,然后递归处理剩下的部分。 * 当走到字符串末尾时,说明当前方案已经完成,将该方案加入最终结果。 * 回溯时需要将上一步加入的子串移除,以便尝试其他分割方案。 diff --git a/src/main/java/backtrack/SubsetsWithDup.java b/src/main/java/backtrack/SubsetsWithDup.java index b685b58..c094b13 100644 --- a/src/main/java/backtrack/SubsetsWithDup.java +++ b/src/main/java/backtrack/SubsetsWithDup.java @@ -16,7 +16,24 @@ import java.util.List; * 链接:https://leetcode.cn/problems/subsets-ii/ */ //不会,有点难 +//二刷会做,简单 public class SubsetsWithDup { + void dfs(List> res,List path,int[] nums ,int begin){ + res.add(new ArrayList<>(path)); + for (int i = begin; i < nums.length; i++) { + if(i>begin&&nums[i]==nums[i-1])continue; + path.add(nums[i]); + dfs(res,path,nums,i+1); + path.remove(path.size()-1); + } + } + public List> subsetsWithDup2(int[] nums) { + Arrays.sort(nums); + List> res=new ArrayList<>(); + List path=new ArrayList<>(); + dfs(res,path,nums,0); + return res; + } public List> subsetsWithDup(int[] nums) { List> res = new ArrayList<>(); diff --git a/src/test/java/backtrack/CombinationSum3Test.java b/src/test/java/backtrack/CombinationSum3Test.java new file mode 100644 index 0000000..b9e7a00 --- /dev/null +++ b/src/test/java/backtrack/CombinationSum3Test.java @@ -0,0 +1,15 @@ +package backtrack; + +import junit.framework.TestCase; + +import java.util.List; + +public class CombinationSum3Test extends TestCase { + + public void testCombinationSum33() { + int k = 3, n = 7; + CombinationSum3 solution = new CombinationSum3(); + List> lists = solution.combinationSum33(k, n); + System.out.println(lists.toString()); + } +} \ No newline at end of file