Leetcode每日一题 20240802 3128.直角三角形

题目描述

给你一个二维 boolean 矩阵 grid 。

请你返回使用 grid 中的 3 个元素可以构建的 直角三角形 数目,且满足 3 个元素值 都 为 1 。

注意:

  • 如果 grid 中 3 个元素满足:一个元素与另一个元素在 同一行,同时与第三个元素在 同一列 ,那么这 3 个元素称为一个 直角三角形 。这 3 个元素互相之间不需要相邻。

3128.直角三角形

测试案例及提示

示例1:

输入:grid = [[0,1,0],[0,1,1],[0,1,0]]

输出:2

解释:

有 2 个直角三角形。

示例 2:

输入:grid = [[1,0,0,0],[0,1,0,1],[1,0,0,0]]

输出:0

解释:

没有直角三角形。

示例 3:

输入:grid = [[1,0,1],[1,0,0],[1,0,0]]

输出:2

解释:

有两个直角三角形。

解题思路

看题目理解题意

题目需要我们统计一个二维数组中的直角三角形数量,三角形的三点元素都为一。我们需要找到三个值为1的点,同时这三个点中需要满足一个元素与另一个元素在 同一行,同时与第三个元素在 同一列。
进一步分解问题

对于一个直角三角形,直角节点是唯一的,因此在寻找直角三角形的时候可以通过遍历直角节点,做到不重不漏。

对于一个直角节点来说,因为三角形的三个节点不需要相邻,因此在行中选取一个1,在列中再选取一个1,就可以组成直角三角形。
思路转换代码

先统计每行和每列中1的个数,使用两个数组存储。

遍历grid,对于每个值为1的,都统计以该节点为直角节点的直角三角形个数,不断加入答案中。
python

python 复制代码
class Solution:
    def numberOfRightTriangles(self, grid: List[List[int]]) -> int:
        ans = 0
        rows = len(grid)
        cols = len(grid[0])
        rowNum = [0] * rows
        colNum = [0] * cols
        for i in range(rows):
            for j in range(cols):
                if grid[i][j] == 1:
                    rowNum[i] += 1
                    colNum[j] += 1
        for i in range(rows):
            for j in range(cols):
                if grid[i][j] == 1:
                    ans += (rowNum[i] - 1) * (colNum[j] - 1)
        return ans
相关推荐
追随者永远是胜利者24 分钟前
(LeetCode-Hot100)42. 接雨水
java·算法·leetcode·职场和发展·go
lifallen27 分钟前
点分治 (Centroid Decomposition)
java·数据结构·算法
jimy11 小时前
小腿三头肌--人体第二心脏;踝关节屈伸环绕运动让小腿三头肌收缩,促进血液回流心脏,降低饭后血糖,减少饭困
职场和发展·程序员创富
田里的水稻2 小时前
FA_规划和控制(PC)-瑞德斯.谢普路径规划(RSPP))
人工智能·算法·数学建模·机器人·自动驾驶
罗湖老棍子2 小时前
【例 1】二叉苹果树(信息学奥赛一本通- P1575)
算法·树上背包·树型动态规划
元亓亓亓3 小时前
LeetCode热题100--76. 最小覆盖子串--困难
算法·leetcode·职场和发展
CHANG_THE_WORLD3 小时前
C++数组地址传递与数据影响:深入理解指针与内存
算法
json{shen:"jing"}3 小时前
力扣-单词拆分
数据结构·算法
aaa7873 小时前
Codeforces Round 1080 (Div. 3) 题解
数据结构·算法
浮生09194 小时前
DHUOJ 基础 85 86 87
数据结构·c++·算法