代码随想录算法训练营第二十五天| LeetCode216.组合总和III、LeetCode17.电话号码的字母组合

LeetCode 216 组合总和III

题目链接:216.组合总和III

【解题思路】

【剪枝】如果sum大于targetSum,直接return

【剪枝】当我们剩余未遍历的元素个数满足不了我们所需要的元素个数,我们就没必要遍历了

【解题步骤】

  • 主函数部分:

    • 【全局变量】二维数组result收集结果集

    • 【全局变量】一维数组path表示当前路径

    • 调用递归函数,传入n,k,1

    • return result

  • 递归函数部分:

    • 1.确定参数和返回值:

      • 返回值:

        • void
      • 参数:

        • 需要求的组合里的和targetSum

        • 单个组合的大小k

        • 收集当前路径已有的和sum

        • 控制当前递归层的起始位置startIndex

    • 2.确定终止条件:

      • 如果我们路径上的元素等于给定的k

        • 1)如果在叶子节点中发现了符合条件的元素

          • 将结果放进结果集
        • 2)return

    • 3.确定单层处理逻辑:

      • 循环遍历当前单层搜索,从startIndex当前位置开始:

        • 每取一个数,就将其累加到sum

        • 将当前元素放入路径集合path

        • 递归,将targetSum,k , sum , i + 1传入

        • 回溯,将累加到sum的数减掉,将放入路径集合path的元素弹出

【代码部分】

java:

java 复制代码
class Solution {
		List<List<Integer>>ans = new ArrayList<>();
		LinkedList<Integer>path = new LinkedList<>();

    public List<List<Integer>> combinationSum3(int k, int n) {
		backTracking(k,n,1,0);
		return ans;
    }

	public void backTracking(int k , int n , int starIndex , int sum){
		if(sum > n)return;


		if(sum == n && path.size() == k){
			ans.add(new ArrayList<>(path));
			return;
		}

		for(int i = starIndex ; i <= 9 - (k - path.size()) + 1 ; i++){
			path.add(i);
			sum += i;
			backTracking(k,n,i + 1,sum);
			sum -= i;
			path.removeLast();
		}
	}
}

LeetCode 17 电话号码的字母组合

题目链接:17.电话号码的字母组合

【解题思路】

用map或者二维数组来映射每一个数字对应的字符串,输出每一个可能的组合

【解题步骤】

  • 主函数部分:

    • 【全局变量】字符串string s表示当前路径下的单个结果

    • 【全局变量】result数组用来存放结果集

    • 定义一个字符串numString,模拟键盘0-9所代表的字符串

    • 调用递归函数,传入digits,numString,0

    • return result

  • 递归函数部分:

    • 1.确定参数和返回值:

      • 返回值:

        • void
      • 参数:

        • 初始对应的2-9数字所表示的字符串numString

        • 传入的字符串string digits

        • 记录当前递归遍历到的字母下标index

    • 2.确定终止条件:

      • 如果index等于我们传入的字符串digits长度,说明遍历结束

        • 将当前的s放入结果集result里,然后return
    • 3.确定单层处理逻辑:

      • 1)将当前传入的字符串转变为相应的数字

      • 2)获取当前数字对应的字符串

      • 3)遍历对应的字符串:

        • 将当前字符取出到s中

        • 递归,调用函数,传入digits和index+1

        • 回溯,将当前字符从s中弹出

【代码部分】

java:

java 复制代码
class Solution {

		List<String> result = new ArrayList<>();
		StringBuilder s = new StringBuilder();

    public List<String> letterCombinations(String digits) {
		if(digits == null || digits.length() == 0)return result;

		String[] numString = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
		bacKTracking(digits,numString,0);
		return result;
    }

	public void bacKTracking(String digits, String[] numString , int index) {
		if (index == digits.length()) {
			result.add(s.toString());
			return;
		}
		//将当前传入的字符串转为相应的数字
		int temp = digits.charAt(index) - '0';
		//用一个str获取当前数字对应的字符串
		String str = numString[temp];
		//遍历对应字符串
		for (int i = 0; i < str.length(); i++) {
			//将当前字符取出到s中
			s.append(str.charAt(i));
			//递归,调用函数
			bacKTracking(digits, numString, index + 1);
			//回溯,将当前字符从s中弹出
			s.deleteCharAt(s.length() - 1);
		}
	}
}
相关推荐
.格子衫.32 分钟前
022数据结构之树状数组——算法备赛
数据结构·算法·1024程序员节
黑科技Python44 分钟前
生活中的“小智慧”——认识算法
学习·算法·生活
sali-tec2 小时前
C# 基于halcon的视觉工作流-章52-生成标定板
开发语言·图像处理·人工智能·算法·计算机视觉
IT古董2 小时前
【第五章:计算机视觉-项目实战之推荐/广告系统】2.粗排算法-(4)粗排算法模型多目标算法(Multi Task Learning)及目标融合
人工智能·算法·1024程序员节
熬了夜的程序员2 小时前
【LeetCode】89. 格雷编码
算法·leetcode·链表·职场和发展·矩阵
對玛祷至昏2 小时前
数据结构理论知识
数据结构·算法·排序算法
oliveira-time2 小时前
二分搜索(Binary Search)
算法
王哈哈^_^3 小时前
【数据集】【YOLO】【目标检测】口罩数据集,口罩佩戴识别数据集 1971 张,YOLO佩戴口罩检测算法实战训练教程。
人工智能·算法·yolo·目标检测·计算机视觉·ai·视觉检测
dragoooon344 小时前
[优选算法专题四.前缀和——NO.31~32 连续数组、矩阵区域和]
数据结构·算法·leetcode·1024程序员节
py有趣4 小时前
LeetCode算法学习之移除元素
java·数据结构·算法