力扣3128. 直角三角形

力扣3128. 直角三角形

题目解析及思路

题目要求找到矩阵中的直角三角形,不必相邻

套路:三个点**枚举(中间)**直角顶点更容易计算

对于(i,j)的直角顶点,构成直角三角形有多少个?

设第 i 行有 rowSum 个 1,第 j 列有 colSum 个 1。根据乘法原理,直角顶点为 (i,j) 的「直角三角形」有

(rowSum−1)⋅(colSum−1)

那么也就是说我们要求出rowSum和colSum,再通过乘法原理计算答案即可

实现见代码

代码

class Solution {
public:
    long long numberOfRightTriangles(vector<vector<int>>& grid) {
        //n为列数
        int n = grid[0].size();
        //提前-1
        vector<int> col_sum(n,-1);
        for(auto &row : grid)
            //遍历每一列 再对应列+=row[j]
            for(int j=0;j<n;j++)
                col_sum[j] += row[j];

        long long ans = 0;
        for(auto &row : grid)
        {
            //reduce求和,同样提前-1
            int row_sum = reduce(row.begin(), row.end()) - 1;
            for(int j=0;j<n;j++)
                //枚举当前点作为直角顶点
                if(row[j] == 1)
                    ans += row_sum * col_sum[j];
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光男孩01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值