当前位置: 首页 > news >正文

LeetCode 解题思路 29(Hot 100)

在这里插入图片描述

解题思路:

  1. 映射关系建立:创建一个哈希表存储数字到字母的映射。
  2. 递归参数: 给定字符串 digits、结果集 result、当前路径 path、当前位置 start。
  3. 递归过程:
  • 当当前位置 start 等于 digits 长度时,说明已经遍历完 digits,加入结果集。
  • 遍历 start 对应的字母集,将当前字母加入临时字符串,递归处理下一个数字。
  • 递归返回后,撤销选择(回溯),继续尝试其他可能的字母。

Java代码:

class Solution {
    private static final Map<Character, String> phoneMap = new HashMap<>() {{
        put('2', "abc");
        put('3', "def");
        put('4', "ghi");
        put('5', "jkl");
        put('6', "mno");
        put('7', "pqrs");
        put('8', "tuv");
        put('9', "wxyz");
    }};

    public List<String> letterCombinations(String digits) {
        List<String> result = new ArrayList<>();
        if (digits.isEmpty()) return result;

        backtrack(digits, result, new StringBuilder(), 0);
        return result;
    }

    private void backtrack(String digits, List<String> result, StringBuilder path, int start) {
        if (start == digits.length()) {
            result.add(path.toString());
            return;
        }
        char digit = digits.charAt(start);
        String letters = phoneMap.get(digit);
        for (char letter : letters.toCharArray()) {
            path.append(letter);
            backtrack(digits, result, path, start + 1);
            path.deleteCharAt(path.length() - 1);
        }
    }
}

在这里插入图片描述

复杂度分析:

  • 时间复杂度: 每个数字可能对应 3 个或 4 个字母。假设输入字符串长度为 n,其中 m 个数字对应 3 个字母,k 个对应 4 个字母,则总组合数为 3 m × 4 k 3^m × 4^k 3m×4k。时间复杂度为 O( 3 m × 4 k 3^m × 4^k 3m×4k)
  • 空间复杂度: 递归调用栈的深度最大为输入字符串长度 n,因此空间复杂度为 O(n)。

解题思路:

  1. 递归参数: 给定整数数组 candidates、剩余和 remain(初始化为给定目标整数 target)、结果集 result、当前路径 path、起始索引 start。
  2. 递归过程:
  • 当当前索引 index 等于 digits 长度时,说明已经遍历完 digits,加入结果集。
  • 遍历 index 对应的字母集,将当前字母加入临时字符串,递归处理下一个数字。
  • 递归返回后,撤销选择(回溯),继续尝试其他可能的字母。

Java代码:

class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> path = new ArrayList<>();
        Arrays.sort(candidates);
        backtrack(candidates, target, result, path, 0);
        return result;
    }

    private void backtrack(int[] candidates, int remain, List<List<Integer>> result, List<Integer> path, int start) {
        if (remain < 0) {
            return;
        } else if (remain == 0) {
            result.add(new ArrayList<>(path));
        } else {
            for (int i = start; i < candidates.length; i++) {
                if (candidates[i] > remain) break;
                path.add(candidates[i]);
                backtrack(candidates, remain - candidates[i], result, path, i);
                path.removeLast();
            }
        }
    }
}

复杂度分析:

  • 时间复杂度: ​O(S),其中 S 是所有可能解的数目。
  • 空间复杂度: O(S * k)​(k 为组合平均长度)。主要消耗来自递归调用栈和结果列表。递归深度最大为 target / min(candidates)。

相关文章:

  • Qt 信号量使用方法
  • trae.ai 编辑器:前端开发者的智能效率革命
  • MySQL的不同字符集的排序规则
  • android gradle一直编译不下来,可能是打开了gradle离线模式
  • Redis 哨兵集群(Sentinel)与 Cluster 集群对比
  • SQL命令
  • TDengine 快速上手:安装部署与基础 SQL 实践(二)
  • docker软件安装
  • 使用linux 指令实现网络助手的功能
  • Git与SVN的区别以及各自的优势
  • Debian编译安装mysql8.0.41源码包 笔记250401
  • 在 Ubuntu 下通过 Docker 部署 WordPress 服务器
  • Unity中的UI坐标和点击接口
  • git中用于生成commitId与其父commitId间的文件差异文件树
  • 部分国产服务器CPU及内存性能测试情况
  • 【Git “push“ 命令详解】
  • Git Flow 分支管理详解
  • Linux 中dmesg, kern.log, syslog 什么关系?有什么用?
  • 汽车加气站操作工考试答题模板
  • linux xargs命令学习
  • 产假工资是谁出?女职工生育能领多少生育津贴?解答来了
  • 人民日报钟声:国际社会应共同维护科学溯源的正确方向
  • 5月起,这些新规将施行
  • 平安资管总经理罗水权因个人工作原因辞职
  • “五一”逃离城市计划:带上帐篷去大自然里充电
  • 十四届全国人大常委会第十五次会议在京闭幕