九日集训 第十五轮 (第七讲) 二维数组

这篇博客主要介绍了矩阵算法在面试中的常见应用,包括统计负数、求对角线元素和、找出最富资产、判断托普利茨矩阵以及寻找矩阵中的幸运数。通过实例代码解析了每个问题的解决方案,涉及二维数组操作、剪枝技巧和STL库的使用。

前言

记录几个面试常见题型

一、知识点

二位数组 ,在算法题中的调用 ** , 列的大小 , vector<vector> grid[0]

二、题目

1、1351 统计矩阵中的负数

1.1 分析
剪枝不用O(n^2)
1.2代码

class Solution {
public:
    int countNegatives(vector<vector<int>>& grid) {
        int rows = grid.size();
        int i = 0;
        int j = grid[0].size()-1;

        int res = 0;
        while (i < rows && j >= 0)
        {
            // 大于则增加一行,对应i增加,直到找到负数,那么此时 rows-i 数量就是对应负数的数量
            while (i < rows && grid[i][j] >= 0)
            {
                ++i;
            }
            res += rows - i;
            --j;
        }

        return res;
    }
};

2、矩阵对角线元素和
2.1题目分析
对角线小标有线性关系,
2.2代码

class Solution {
public:
    int diagonalSum(vector<vector<int>>& mat) {
        int sum = 0;

        for(int i = 0 ; i < mat.size() ; i ++)
        {
            sum +=mat[i][i];
        }
        int n = mat[0].size() - 1;
        for(int i =  n; i >=0 ; i --)
        {
            if(2*i != n)
                sum += mat[n - i][i];
        }

        return sum;

    }

3最富资产
3.1题目分析
stl 是个好东西
3.2代码

class Solution {
public:
     int maximumWealth(vector<vector<int>>& accounts) {
    vector<int> sum;               // 所有客户的资产总量
    for(int i = 0;i < accounts.size();i++){
        sum.push_back(accumulate(accounts[i].begin(),accounts[i].end(),0)); // 在这里使用accumulate计算accounts[i]的和
    }
    sort(sum.begin(),sum.end(),greater<>());            // 让sum按降序排列
    return sum[0];
}

 
};

4托普利茨矩阵
4.1题目分析
没啥想法,直接遍历
4.2代码

class Solution {
public:
    bool isToeplitzMatrix(vector<vector<int>>& matrix) {
    int m =matrix.size();
    int n =matrix[0].size();
    for(int i =0;i< m-1;i++){
        for(int j=0;j<n-1;j++){
            if(matrix[i][j]!=matrix[i+1][j+1]){return false;}
        }
    }
    return true;
    }
};

5 矩阵中的幸运数
5.1题目分析
多开两个储存最值
5.2代码

class Solution {
public:
    vector<int> luckyNumbers (vector<vector<int>>& matrix) {
        vector<int> row_min(matrix.size(), 100000);
        vector<int> col_max(matrix[0].size(), 0);

        for (int i = 0; i < matrix.size(); i++) {
            for (int j = 0; j < matrix[0].size(); j++) {
                row_min[i] = min(row_min[i], matrix[i][j]);
                col_max[j] = max(col_max[j], matrix[i][j]);
            }
        }

        vector<int> ans;
        for (int i = 0; i < matrix.size(); i++) {
            for (int j = 0; j < matrix[0].size(); j++) {
                if (matrix[i][j] == row_min[i] && matrix[i][j] == col_max[j])
                    ans.push_back(matrix[i][j]);
            }
        }
        return ans;
    }
};

三、做题记录

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值