【LeetCode热题100(76/100)】划分字母区间

题目地址:链接

思路:

  1. 使用map记录最远字符串的地址
  2. 重新遍历,如果当前内容等于最远字符串地址,那么入队列
function partitionLabels(s: string): number[] {
    let ans = [];
    const n = s.length;
    const map = new Map();
    for(let i = 0; i < n; i ++) {
        map.set(s[i], i);
    }
    let maxIdx = 0;
    for(let i = 0; i < n; i ++) {
        let q = map.get(s[i]);
        maxIdx = Math.max(maxIdx, q);
        if(maxIdx <= i) {
            ans.push(i);
            maxIdx ++;
        }
    }
    ans = ans.map((num, idx) => {
        if(idx) return num - ans[idx - 1];
        else return num + 1
    })
    return ans;
};

### LeetCode 100 相关知识点总结 以下是基于引用内容以及常见 LeetCode 目的知识点分类和说明: #### 一、动态规划(Dynamic Programming) 动态规划是一种通过把原问分解为相对简单的子问的方式来求解复杂问的方法。 - **记忆化 DP**:用于优化递归过程中的重复计算,减少时间复杂度[^1]。 - 经典目: - `LeetCode 1262`:可被三整除的最大和,利用状态转移方程解决最大值问。 - `LeetCode 5`:最长回文子串,采用中心扩展法或动态规划方法实现字符串匹配[^4]。 #### 二、贪心算法(Greedy Algorithm) 贪心算法通常用来解决最优解问,在每一步都选择局部最优解以期望达到全局最优解。 - 特点:无需考虑后续影响,仅关注当前决策。 - 经典目: - `LeetCode 763`:划分字母区间,记录每个字符最后一次出现的位置并逐步更新结束位置。 - `LeetCode 1221`:分割平衡字符串,统计左右部分的字符数量差异来判断切割点[^3]。 #### 三、回溯算法(Backtracking) 回溯算法适用于探索所有可能的选择路径,常用于组合、排列等问。 - 基本思路:尝试构建候选解决方案,并在发现不满足条件时撤销最近一次操作。 - 经典目: - `LeetCode 17`:电话号码的字母组合,枚举所有可能的结果集合[^2]。 - `LeetCode 39/40`:组合总和系列问,使用剪枝技术提高效率。 #### 四、数组与矩阵处理 数组问是编程面试中最常见的类型之一,涉及到索引运算、边界控制等方面。 - 关键技巧:双指针、滑动窗口等高效遍历方式。 - 经典目: - `LeetCode 121`:买卖股票的最佳时机,维护最低价格变量完成单次交易利润最大化。 - `LeetCode 55/45`:跳跃游戏及其变种版本,模拟可达范围内的最远距离或者最少步数。 #### 五、链表结构 链表数据结构因其灵活性而广泛应用于实际场景中,主要考察节点间的逻辑关系调整能力。 - 核心概念:头插法、尾插法、反转链表等基本操作。 - 经典目: - `LeetCode 2`:两数相加,逆序存储数值并通过逐位累加得到最终结果。 #### 六、其他重要主 除了上述几大类之外还有许多值得深入学习的内容如下所示: - **分治策略**:将大规模问拆分成若干独立的小规模实例分别解答后再合并起来形成整体方案; - **图论基础**:包括但不限于拓扑排序、连通性检测等领域应用; - **高级搜索技术**:比如 A* 启发式寻路算法等等。 ```python def example_code(): """ 示例代码 """ pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值