C++ 中的孤独像素 II2025年5月22日 | 阅读10分钟 孤独像素 II 问题是寻找二维字符网格中特定的黑色像素('B')。网格包含两种类型的像素:黑色('B')和白色('W')。如果一个黑色像素满足两个条件,则称其为孤独像素:
目标是计算网格中孤独黑色像素的总数。 输入示例例如,考虑以下网格: 在这个网格中:
解决问题的步骤为了高效地解决这个问题,请按照以下步骤进行: 步骤 1:计算行和列中的黑色像素数量 首先,计算每一行和每一列中黑色像素的数量。这些信息有助于我们快速确定一个黑色像素是否是孤独的。 例如,在网格中: 行计数
列计数
步骤 2:检查每个黑色像素 对于网格中的每个黑色像素:
如果两个条件都成立,则它是一个孤独像素。 方法 1:简单方法程序输出 Number of Lonely Pixels: 3 1. 理解输入输入是一个由字符 'B' 和 'W' 组成的二维网格或矩阵。
我们的目标是找到孤独黑色像素的数量。黑色像素是孤独的,如果:
例如 在这里,所有黑色像素都是孤独的,因为它们中的每一个都是其各自行和列中唯一的 'B'。 2. 如何处理这个问题要找到孤独的黑色像素,我们需要:
如果两个条件都成立,则该像素是孤独的,我们对其进行计数。 3. 代码分步解释步骤 1:计算黑色像素 我们创建两个列表(或数组):
然后我们逐个单元地遍历整个网格:
例如,如果网格是: 计数后: rowCount 变为 [1, 1, 1],因为每一行都有 1 个 'B'。 colCount 变为 [1, 1, 1, 0],因为:
步骤 2:检查每个像素 接下来,我们再次遍历网格。对于每个单元格: 如果它包含 'B':
如果行和列的计数都为 1,这意味着这个 'B' 是孤独的。 例如 第0行、第0列的第一个 'B' 是孤独的,因为:
同样,其他黑色像素也是孤独的。 步骤 3:计算孤独像素 每次找到一个孤独像素,我们都会增加一个计数器(lonelyCount)。在过程结束时,计数器将给出网格中孤独黑色像素的总数。 4. 效率这个解决方案很高效,因为:
5. 示例演练让我们回顾一下这个网格: 步骤 1(计算黑色像素)
步骤 2(检查孤独像素) 第一个 'B' 在 (0, 0)
第二个 'B' 在 (1, 1)
第三个 'B' 在 (2, 2)
步骤 3(计算孤独像素)
6. 最终输出对于给定的示例网格,孤独黑色像素的数量是 3。 方法 2:使用 Map 跟踪行和列与使用固定大小的 数组 来存储 rowCount 和 colCount 不同,我们可以使用哈希表(Map)来动态跟踪行和列中黑色像素的数量。当网格稀疏或网格尺寸非常大时,这种方法尤其有用。 程序输出 Number of Lonely Pixels: 3 说明使用的数据结构
第一次遍历网格
第二次使用 blackPixels 进行遍历
计算孤独像素
输出
示例演练对于网格:
复杂度分析时间复杂度 第一次遍历: O(m×n)
第二次遍历: O(k)
总计: O(m×n),因为 k≤m×n。 空间复杂度 行和列的 Map: O(m+n),用于存储计数。 黑色像素位置: O(k)。 总计: O(m+n+k)。 方法 3:不使用额外数据结构的行和列迭代无需使用 Map 或数组来跟踪计数,我们可以在遍历网格时直接计算计数。这种方法避免了使用额外的存储空间来存放行和列的计数。 程序输出 Number of Lonely Pixels: 3 说明网格遍历
计算行中的黑色像素数量
计算列中的黑色像素数量
检查孤独性
最终计数
示例演练给定网格: 步骤 1:从 (0, 0) 开始
步骤 2:移动到 (0, 1)
步骤 3:继续到 (1, 1)
步骤 4:继续到 (2, 2)
最终计数
复杂度分析外层循环
每个黑色像素的行计数
每个黑色像素的列计数
总时间
空间复杂度额外存储
网格存储
优点C++ 中的孤独像素 II 有几个优点,如下所示: 简单性
无额外空间(高效的空间利用)
无排序
缺点C++ 中的孤独像素 II 有几个缺点,如下所示: 重复计数
不适用于大型网格
|
Zobrist 散列简介 Zobrist 散列是一种哈希函数方法,用于快速为棋盘游戏状态生成唯一数字,主要用于国际象棋、围棋和跳棋。Albert Zobrist 在 20 世纪 60 年代开发了它,它为每种可能的游戏...
14 分钟阅读
素数测试方法是数论和计算机科学中最简单的子类别之一,其中输入正整数被测试以确定它是否属于自然素数。一个数被描述为素数,如果它...
阅读 12 分钟
计算机科学领域的主要挑战之一是计算系统内任务的交互。由于系统的复杂性不断增加,因此必须拥有技术先进的调度算法。在这些算法中,优先级调度算法很清楚...
阅读 19 分钟
在本文中,我们将讨论循环依赖,这是一种当两个或多个实体(模块/类/组件)直接或间接相互依赖的条件。换句话说,当一个模块或组件的执行或编译需要另一个模块作为先决条件时,就会出现循环依赖...
阅读 4 分钟
在本文中,我们将讨论。 deducing_this 功能在 C++ 中是一个高级概念,在 C++20 中引入。它允许更灵活、更清晰的代码,尤其是在考虑 lambda 函数和成员方法时。下面是 deducing_this 的一些功能,涵盖了……
5 分钟阅读
为了确定主教能否吃掉棋盘上的兵,请检查该兵是否与主教位于同一条对角线上。当它们行和列坐标的绝对差相等时,它为真。在 C++ 中高效实现此逻辑...
7 分钟阅读
理解 Luhn 算法,也称为“模 10”或“模 10”算法,是一种简单的校验和公式,用于验证身份证号,如信用卡号、IMEI 号等。由于它……
阅读 4 分钟
另一个传统的计算机算法问题是识别数组元素中可以加到特定目标的两个值。这个问题适用于各种学科。识别构成特定值的组件和...
阅读 16 分钟
在本文中,我们将讨论 C++ 中的 Vector::operator= 和 Vector::operator[]。但在讨论这些向量之前,我们必须了解 C++ STL。什么是“C++ STL”?“C++ STL”的首字母缩写代表“C++ 标准模板库”。它是一组模板类,用于为 C++ 提供……
5 分钟阅读
异字母词(Heterogram)是一个单词、短语或句子,其中每个字母最多使用一次。这是语言学部分的一个好概念,在计算语言学领域和猜谜游戏中将会有很好的应用...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India