leetcode
leetcode 2451 ~ 2500
所有单元格的远离程度之和

所有单元格的远离程度之和

难度:

标签:

题目描述

代码结果

运行时间: 356 ms, 内存: 24.6 MB


/*
 * 思路:
 * 使用Java Stream API来实现相同的功能。
 * 我们仍然遍历网格中的每一个单元格,然后使用Stream的sorted方法进行排序。
 */
import java.util.stream.*;
import java.util.*;

public class Solution {
    public int[][] allCellsDistOrder(int R, int C, int r0, int c0) {
        return IntStream.range(0, R * C)
                        .mapToObj(i -> new int[]{i / C, i % C})
                        .sorted(Comparator.comparingInt(a -> Math.abs(a[0] - r0) + Math.abs(a[1] - c0)))
                        .toArray(int[][]::new);
    }
}

解释

方法:

这个题解首先遍历了给定的网格(grid),对每个元素进行处理。如果发现一个正值的元素,就将其视为一个部分(part)的起始点,然后使用广度优先搜索(BFS)来标记和累加这个部分中所有连通的元素的值,并计算这部分的元素个数。在搜索过程中,每访问一个元素,就将其值设置为-1,以防重复访问。每个部分的总和和元素数量被记录下来。最后,通过比较每个部分的总和和总元素数量与整个网格的总和和总元素数量,计算出所有单元格的远离程度之和。

时间复杂度:

O(n^2)

空间复杂度:

O(n^2)

代码细节讲解

🦆
在广度优先搜索(BFS)中,为什么在访问每个元素时将其值设置为-1?这样做的主要目的是什么?
在BFS中将元素值设置为-1是用来标记该元素已经被访问过,防止在同一次搜索中重复访问同一个元素。这样做有助于确保搜索只处理每个元素一次,避免无限循环或重复计算,从而提高算法的效率和准确性。
🦆
在该算法中处理边界条件时,你是如何确保不会访问网格外的元素的?具体是通过哪些判断实现的?
为了确保不访问网格外的元素,算法在尝试访问一个新位置之前会检查该位置是否有效。具体的判断包括检查行索引(nr)和列索引(nc)是否在有效范围内,即0 <= nr < n 和 0 <= nc < n,其中n是网格的大小。如果这些条件不满足,就跳过对该位置的处理。
🦆
在计算每个部分的总和和元素数量时,如果网格中存在孤立的正值元素,算法是如何处理这种情况的?
如果网格中存在孤立的正值元素,算法会将其视为一个单独的部分。在BFS的过程中,由于这个元素四周没有其他连接的正值元素,队列中不会添加新元素,因此BFS会在访问这一个元素后结束。该元素的值和数量(1个)会被记录为一个部分的总和和元素数量。
🦆
算法在处理完所有部分后,如何利用这些部分的总和和元素数量来计算所有单元格的远离程度之和?具体的计算公式是什么?
在处理完所有部分后,算法使用每个部分的总和(partSum)和元素数量(partNum)以及整个网格的总和(totalSum)和总元素数量(totalNum)来计算所有单元格的远离程度之和。具体的计算公式为:对每个部分,计算(totalSum - partSum) * partNum,然后将所有部分的这个计算结果累加起来。这样做的目的是量化每个部分与剩余部分的差异,并根据每个部分的元素数量加权这种差异。

相关问题