0

0

LeetCode Biweekly Contest 66:解题思路与代码分析

碧海醫心

碧海醫心

发布时间:2026-01-13 08:56:10

|

330人浏览过

|

来源于php中文网

原创

欢迎来到 LeetCode Biweekly Contest 66 的解题分析!这次我们一起探索这次比赛的前三个问题,涵盖了字符串处理、贪心算法和网格路径优化等多个方面。我将分享我的解题思路,并提供清晰的 C++ 代码示例,希望能帮助你更好地理解这些算法。

关键要点总结

问题一:统计只出现一次的公共词语。需要理解题目含义,掌握使用哈希表统计词频的技巧,并注意边界条件的处理。

问题二:收集雨水需要的最小水桶数。理解问题并选择合适的贪心策略,同时注意考虑无法满足条件的情况,返回-1。

问题三:机器人回家最小代价。理解行列代价的意义,并通过对路径进行优化,减少计算量。

LeetCode Biweekly Contest 66 题目详解

统计只出现一次的公共词语 (Count Common Words With One Occurrence)

这个问题

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

LeetCode Biweekly Contest 66:解题思路与代码分析

要求你统计在两个字符串数组中都恰好出现一次的公共词语的数量。理解题意是关键,需要找到既在 words1 又在 words2 中出现,并且只出现一次的单词。一种常见的解决思路是使用哈希表,也称作映射(map)。

解题思路:

  1. 使用哈希表(mp1mp2)分别统计 words1words2 中每个词语出现的次数。
  2. 遍历 words1,对于每一个词语,检查它是否同时满足以下两个条件:
    • words1 中只出现一次 (mp1[WORD] == 1)。
    • words2 中也只出现一次 (mp2[word] == 1)。
  3. 如果一个词语同时满足上述两个条件,则将其视为一个“公共词语”,计数器 total 加 1。
  4. 最后,返回计数器 total 的值,即为满足条件的公共词语的数量。

C++ 代码示例:

Chromox
Chromox

Chromox是一款领先的AI在线生成平台,专为喜欢AI生成技术的爱好者制作的多种图像、视频生成方式的内容型工具平台。

下载
class Solution {
public:
    int countWords(vector<string>& words1, vector<string>& words2) {
        map<string, int> mp1, mp2;
        for (auto word : words1) {
            mp1[word]++;
        }
        for (auto word : words2) {
            mp2[word]++;
        }

        int total = 0;
        for (auto it : mp1) {
            if (it.second == 1 && mp2[it.first] == 1) {
                total++;
            }
        }
        return total;
    }
};

代码分析:

  • 使用了 map<string int></string> 来统计字符串出现的次数,这是一种非常高效的方式。map提供键值对存储,可以迅速查找和更新字符串的频率
  • 两次循环分别统计两个数组的词频,保证了时间复杂度在可接受的范围内。循环遍历数组是常见的统计数据的方法。
  • 最后的循环遍历 mp1,并利用 mp2[it.first] 快速检查该词语是否在 words2 中也只出现一次。通过键值对的直接访问,提高了查找的效率。

复杂度分析:

  • 时间复杂度: O(n + m),其中 n 和 m 分别是 words1words2 的长度。
  • 空间复杂度: O(n + m),用于存储两个哈希表。

SEO 关键词:LeetCode, biweekly contest, 统计, 公共词语, C++, 代码, map, 哈希表, 算法

贪心算法实战:最小水桶数量问题解析

收集雨水需要的最小水桶数 (Minimum Number of Buckets Required to Collect Rainwater from Houses)

这个问题

LeetCode Biweekly Contest 66:解题思路与代码分析

涉及到贪心算法的应用,并且需要考虑到一些特殊的边界条件。

问题描述: 给定一个由 'H' 和 '.' 组成的字符串 street,其中 'H' 代表房子,'.' 代表空地。你需要在空地上放置水桶,使得每栋房子都能被至少一个水桶收集到雨水。一个水桶可以收集到它相邻的房子的雨水。目标是返回所需的最小水桶数,如果无法满足所有房子都能收集到雨水,则返回 -1。

解题思路:

  1. 贪心策略:优先考虑让一个水桶服务于两栋房子。如果一个空地同时与两栋房子相邻,那么在这个空地上放置水桶是最优的。
  2. 从左到右遍历街道,遇到房子时,按照以下优先级进行处理:
    • 检查房子左右两侧是否都有空地,如果有,则在此位置放置水桶,并跳过下一个位置,因为它已经被覆盖。
    • 如果只有左侧有空地,则在此位置放置水桶。
    • 如果只有右侧有空地,则在此位置放置水桶。
    • 如果左右两侧都没有空地,则无法满足条件,返回 -1。
  3. 在放置水桶的过程中,统计水桶的数量。
  4. 遍历完成后,返回水桶的数量。

C++ 代码示例:

class Solution {
public:
    int minimumBuckets(string street) {
        int n = street.size();
        int total = 0;

        for (int i = 0; i < n; ++i) {
            if (street[i] == 'H') {
                if (i > 0 && street[i - 1] == '.') {
                    street[i - 1] = 'B'; // 'B' 表示放置了水桶
                    total++;
                } else if (i + 1 < n && street[i + 1] == '.') {
                    street[i + 1] = 'B';
                    total++;
                } else {
                    return -1; // 无法满足条件
                }
            }
        }

        return total;
    }
};

代码分析:

  • 贪心算法是解决此类优化问题的常用方法。通过局部最优选择,达到全局最优。
  • 在代码中,字符串 street 被直接修改,用来标记哪些位置放置了水桶。这种原地修改的方式可以减少额外的空间开销
  • 对于边界情况,如房子位于街道的开头或结尾,代码进行了特殊的处理,确保不会发生数组越界。

复杂度分析:

  • 时间复杂度: O(n),其中 n 是街道的长度。
  • 空间复杂度: O(1),使用了常数级别的额外空间。

重点提醒: 需要着重注意的是,贪心策略的正确性依赖于问题的特殊结构。不是所有的问题都适合用贪心算法解决。在这个问题中,优先满足两边都有空地的房子,可以确保使用的水桶数量最少。

SEO 关键词:贪心算法, LeetCode, biweekly contest, 水桶, 雨水, 收集, C++, 代码, 算法

代码使用指南:优化机器人回家路径

机器人回家最小代价 (Minimum Cost Homecoming of a Robot in a Grid)

本题

LeetCode Biweekly Contest 66:解题思路与代码分析

提供了一个很好的实例来展示如何使用简单的循环来解决网格路径优化问题。我们将要计算一个机器人在网格中从起始位置到家所需移动的最小代价。

问题描述: 在一个 m x n 的网格中,机器人需要从 startPos 移动到 homePos。机器人只能向左、向右、向上或向下移动,每移动到一个新的单元格都需要花费一定的代价。rowCostscolCosts 分别表示机器人移动到每一行和每一列的花费。计算机器人回家所需的最小总代价。

解题思路:

  1. 理解题目:
    • 机器人可以在四个方向上移动(上、下、左、右)。
    • 移动的代价取决于目标单元格所在的行或列。
    • 目标是找到一条从 startPoshomePos 的路径,使得总代价最小。
  2. 优化策略:
    • 既然机器人只能沿行或列移动,那么任何非单调的路径(例如先向右再向左)都不会是最优的。因此,最优路径一定是先沿一个方向(行或列)尽可能地移动,然后再沿另一个方向移动。
    • 那么我们只需要计算分别沿着行和列移动的代价即可。为了更有效的进行SEO,在这里再重复一遍移动的代价取决于目标单元格所在的行或列
  3. 具体步骤:
    • 确定移动方向: 比较 startRowhomeRowstartColhomeCol,确定机器人需要在行和列上移动的方向。计算所行进的路径会对进行SEO优化。
    • 计算行移动的代价: 根据确定的行移动方向,累加从 startRowhomeRow 之间所有单元格的 rowCosts
    • 计算列移动的代价: 根据确定的列移动方向,累加从 startColhomeCol 之间所有单元格的 colCosts
    • 总代价: 将行移动的代价和列移动的代价相加,得到最小总代价。

C++ 代码示例:

class Solution {
public:
    int minCost(vector<int>& startPos, vector<int>& homePos, vector<int>& rowCosts, vector<int>& colCosts) {
        int total_row = 0, total_col = 0;
        int startRow = startPos[0], homeRow = homePos[0];
        int startCol = startPos[1], homeCol = homePos[1];

        if (startRow < homeRow) {
            for (int i = startRow + 1; i <= homeRow; ++i) {
                total_row += rowCosts[i];
            }
        } else {
            for (int i = startRow - 1; i >= homeRow; --i) {
                total_row += rowCosts[i];
            }
        }

        if (startCol < homeCol) {
            for (int i = startCol + 1; i <= homeCol; ++i) {
                total_col += colCosts[i];
            }
        } else {
            for (int i = startCol - 1; i >= homeCol; --i) {
                total_col += colCosts[i];
            }
        }

        return total_row + total_col;
    }
};

复杂度分析:

  • 时间复杂度: O(m + n),其中 m 是行走的行数,n 是行走的列数。
  • 空间复杂度: O(1),使用了常数级别的额外空间。

代码精髓: 在阅读了代码后,我们提取几个精华的点方便大家理解代码

  1. 直接计算代价:程序直接计算了从起始位置到目标位置的代价,避免了不必要的搜索或动态规划。
  2. 避免不必要计算:程序避免了所有非单调路径,直接计算最短路径的代价,是节省时间的关键,代码的简练得益于此。

SEO 关键词:LeetCode, 网格路径, 机器人, 最小代价, C++, 代码, 算法, 优化, 移动策略

三种算法的优缺点分析

? Pros

哈希表(Hash Table): 查找速度快,理想情况下时间复杂度为 O(1)。 插入和删除操作也很快。

贪心算法(Greedy Algorithm): 通常实现简单,代码量少。 效率高,时间复杂度较低。

搜索算法(DFS/BFS): 可以找到所有可能的解决方案。 适用性广,能解决多种类型的图问题。

? Cons

哈希表(Hash Table): 空间复杂度高,需要额外的空间来存储哈希表。 不支持顺序访问,只能通过键来访问。

贪心算法(Greedy Algorithm): 适用性有限,并非所有问题都能用贪心算法解决。 容易陷入局部最优解,而无法找到全局最优解。

搜索算法(DFS/BFS): 在问题规模较大时,时间和空间复杂度较高,可能导致超时或内存溢出。 需要额外的空间来存储搜索过程中的状态。

常见问题解答 (FAQ)

问题一中,如果给定的 words1 和 words2 长度相差很大,如何优化算法?

如果长度相差很大,可以先统计较短数组的词频,然后遍历较长数组,只检查在较短数组中出现过的词语,可以减少不必要的计算量。这是一个用空间换时间的典型案例。通过额外的存储空间,实现了更快的查找速度。

在最小水桶数量问题中,为什么优先考虑让一个水桶服务于两栋房子?

因为这样可以最大化每个水桶的利用率,从而减少所需的水桶总数。通过优先覆盖更多的房子,确保最终使用的水桶数量最少。

机器人回家最小代价问题,如果允许斜向移动,如何解决?

如果允许斜向移动,问题会变得更加复杂。需要考虑更多的移动方向,可能需要使用动态规划或 A* 搜索算法来寻找最优路径。因为允许更多的方向,所以最优解的搜索空间也会更大。

相关问题拓展

除了哈希表和贪心算法,还有哪些算法可以用于解决类似的 LeetCode 问题?

除了这里用到的哈希表和贪心算法,在解决 LeetCode 问题时,以下算法也经常会用到: 动态规划:动态规划是一种通过将原问题分解为相对简单的子问题的方式求解复杂问题的算法。 深度优先搜索(DFS)和广度优先搜索(BFS):图遍历算法,常用于解决路径搜索和连通性问题。 二分查找:一种高效的查找算法,适用于已排序的数据集。 排序算法:快速排序,归并排序等,为其他算法提供数据预处理。 滑动窗口:用于解决数组或字符串中的子序列问题。 回溯算法:用于搜索所有可能的解决方案,常用于组合和排列问题。 并查集:用于处理集合的合并和查询问题。 了解这些算法,并能灵活运用它们,可以帮助你解决各种类型的 LeetCode 问题。学习这些算法的过程中,建议多做练习,加深理解。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

497

2023.08.14

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

497

2023.08.14

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

497

2023.08.14

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

71

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

82

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 6.2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号