每日一练 | Day 2

LCP 40. 心算挑战

题目链接

https://leetcode.cn/problems/right-triangles/

相关算法

哈希、数组、数学

题目描述

给你一个二维 boolean 矩阵 grid

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

注意:

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

  • 数据范围:
    • 1 <= grid.length <= 1000
    • 1 <= grid[i].length <= 1000
    • 0 <= grid[i][j] <= 1

解题思路

本题直角三角形 的表述看上去复杂,实际上很简单,即以一个元素作为三角形的角上的点,如果和这个元素的位置同行同列均有元素,就可以组成直角三角形。因此易得:位于坐标(x,y)处的元素可以构成(countX - 1)*(countY - 1)个直角三角形
countXcountY 分别指代坐标(x,y)处行和列上值为 1 的元素个数

完整代码

java 复制代码
class Solution {
    public long numberOfRightTriangles(int[][] grid) {
        int[] countX = new int[grid[0].length];
        long res = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                countX[j] += grid[i][j];
            }
        }
        for (int i = 0; i < grid.length; i++) {
            int countY = 0;
            for (int j = 0; j < grid[0].length; j++) {
                countY += grid[i][j];
            }
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 1) {
                    res += (countX[j] - 1) * (countY - 1);
                }
            }
        }
        return res;
    }
}
  • 时间复杂度:O(mn)
  • 空间复杂度:O(n)
相关推荐
一叶落43810 分钟前
【LeetCode】1. 两数之和(Two Sum)— 哈希表经典题解(C语言)
数据结构·c++·算法·leetcode
我头发还没掉光~14 分钟前
P1027 [NOIP 2001 提高组] Car 的旅行路线
c++·算法
adore.96830 分钟前
3.09 复试学习
c++·学习·算法
m0_672703311 小时前
上机练习第43天
数据结构·算法
逆境不可逃1 小时前
【从零入门23种设计模式13】行为型之责任链模式
算法·leetcode·游戏·设计模式·责任链模式
不想看见4041 小时前
Shuffle an Array随机与取样--力扣101算法题解笔记
开发语言·c++·算法
逝雪Yuki1 小时前
P4017 最大食物链计数
c++·算法·动态规划·拓扑排序·洛谷
程序员小明儿1 小时前
量子计算探秘:从零开始的量子编程与算法之旅 · 第四篇
算法·量子计算
程序员小明儿1 小时前
量子计算探秘:从零开始的量子编程与算法之旅 · 第一篇
算法·量子计算
不想看见4041 小时前
Add Strings数字处理--力扣101算法题解笔记
数据结构·算法·leetcode