【力扣】3128. 直角三角形 JAVA

一、题目描述

给你一个二维 boolean 矩阵 grid 。

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

注意:

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

  • 示例 1:

    0 1 0

    0 1 1

    0 1 0

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

    输出:2

    解释:

    有 2 个直角三角形。

  • 示例 2:

    1 0 0 0

    0 1 0 1

    1 0 0 0

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

    输出:0

    解释:

    没有直角三角形。

  • 示例 3:

    1 0 1

    1 0 0

    1 0 0

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

    输出:2

    解释:

    有两个直角三角形。

二、解题思路

复制代码
/**
 *  解题思路:
 *  1、因为要找直角三角形,也就是说我们要找直角的顶点,也就是数组的交点为1
 *  2、先判断交点为1,然后找到交点为1所在的行的1的个数,然后再找到交点为1所在的列的1的个数
 *  3、解决第2步的问题,我们可以将二维数组的行和列抽取出来成为两个一维数组
 *  4、最后将每一行1的个数减去1 乘以 每一列1个数减1 最终得到结果(这个减去的1就是交点位置的1)
 */

三、示例代码

java 复制代码
public static long numberOfRightTriangles(int[][] grid) {
        //结果
        long sum = 0;
        //行数
        int m = grid.length;
        //列数
        int n = grid[0].length;
        //一维数组行
        int[] row = new int[m];
        //一维数组列
        int[] col = new int[n];
        for (int i = 0; i < m; i ++) {
            for (int j = 0; j < n; j ++) {
                //每行的j个数字相加,和为几,就代表每行有几个1
                row[i] += grid[i][j];
                //每列的i个数字相加,和为几,就代表每列有几个1
                col[j] += grid[i][j];
            }
        }
        for (int i = 0; i < m; i ++) {
            for (int j = 0; j < n; j ++) {
                //判断交点为1
                if (grid[i][j] == 1) {
                    //将每一行1的个数减去1 乘以 每一列1个数减1 最终得到结果
                    sum += (row[i] - 1) * (col[j] - 1);
                }
            }
        }
        return sum;
    }


    public static void main(String[] args) {
        int[][] grid = {{0,1,0},{0,1,1},{0,1,0}};
        System.out.println(numberOfRightTriangles(grid));
    }
相关推荐
一 乐1 分钟前
医院挂号|基于springboot + vue医院挂号管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·医院挂号管理系统
weixin_513449967 分钟前
PCA、SVD 、 ICP 、kd-tree算法的简单整理总结
c++·人工智能·学习·算法·机器人
code_pgf17 分钟前
Qwen2.5-VL 算法解析
人工智能·深度学习·算法·transformer
鱼鳞_18 分钟前
Java学习笔记_Day29(异常)
java·笔记·学习
烟锁池塘柳020 分钟前
一文讲透 C++ / Java 中方法重载(Overload)与方法重写(Override)在调用时机等方面的区别
java·c++·面向对象
一叶飘零_sweeeet23 分钟前
深入拆解 Fork/Join 框架:核心原理、分治模型与参数调优实战
java·并发编程
云烟成雨TD33 分钟前
Spring AI Alibaba 1.x 系列【23】短期记忆
java·人工智能·spring
Code-keys40 分钟前
Android Codec2 Filter 算法模块开发指南
android·算法·音视频·视频编解码
摇滚侠1 小时前
帮我整理一份 IDEA 开发中常用快捷键
java·ide·intellij-idea
无忧智库1 小时前
低空经济新基建:构建低空飞行大数据中心与行业应用算法工厂的全景式蓝图(WORD)
算法