《五月集训》第十一日——矩阵

前言

这是五月集训的第十一日,今日的训练内容是 矩阵

解题报告

1.力扣1351

原题链接

https://leetcode.cn/problems/count-negative-numbers-in-a-sorted-matrix/

题目概述

给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。 请你统计并返回 grid 中 负数 的数目。

解题思路

因为这是有序的数组,因此每一行到第一个负数就可以得到这一行的负数的个数了,然后每一行的负数个数累加返回就可以了。

源码剖析

int countNegatives(int** grid, int gridSize, int* gridColSize){
    int ans = 0;
    int m = gridSize,n = gridColSize[0];
    int i,j;
    for(i = 0;i<m;++i){
        for(j = 0;j<n;j++){
            if(grid[i][j]<0){
                ans+=n-j;
                break;
            }
        }
    }
    return ans;
}

2.力扣1672

原题链接

https://leetcode.cn/problems/richest-customer-wealth/

题目概述

给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i​​​​​​​​​​​​ 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。

客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。

解题思路

直接累加每一行的所有数据然后返回最大值即可。

源码剖析

int maximumWealth(int** accounts, int accountsSize, int* accountsColSize){
    int max = 0;
    int i,j;
    for(i=0;i<accountsSize;++i){
        int sum = 0;
        for(j=0;j<accountsColSize[0];++j){
            sum+=accounts[i][j];
        }
        if(sum>=max) max = sum;
    }
    return max;
}

3.力扣832

原题链接

https://leetcode.cn/problems/flipping-an-image/

题目概述

给定一个 n x n 的二进制矩阵 image ,先 水平 翻转图像,然后 反转 图像并返回 结果 。

水平翻转图片就是将图片的每一行都进行翻转,即逆序。

例如,水平翻转 [1,1,0] 的结果是 [0,1,1]。
反转图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替>换。

例如,反转 [0,1,1] 的结果是 [1,0,0]。

解题思路

首先将范式提前写上,方便直接使用。先调用范式申请内存并返回容量,然后对新的数组使用循环赋值。虽然题中先后给定了两个操作,但是实际上这两个操作的先后顺序不会有很大的影响,因此直接在同一个循环中,先使用异或运算符取反,再从右往左赋值给数组即可。

源码剖析

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int **myMalloc(int r, int c, int* returnSize, int** returnColumnSizes) {   //调用一下范式,用来申请内存
    int i;
    int **ret = (int **)malloc( sizeof(int *) * r );        
    *returnColumnSizes = (int *)malloc( sizeof(int) * r );  
    *returnSize = r;                                        
    for(i = 0; i < r; ++i) {
        ret[i] = (int *)malloc( sizeof(int) * c );          
        (*returnColumnSizes)[i] = c;                       
    }    
    return ret;
}
int** flipAndInvertImage(int** image, int imageSize, int* imageColSize, int* returnSize, int** returnColumnSizes){
    int i,j;
    int r = imageSize;
    int c = imageColSize[0];                                            //注意,这是一个数组,一定要带下标
    int **ret=myMalloc(r,c,returnSize,returnColumnSizes);               //调用函数内存申请,容量返回也包含在内了
    for(i=0;i<r;++i){
        for(j=0;j<c;++j){
            ret[i][j]=(image[i][c-j-1]^1);                               //直接使用^运算符实现反转,用循环实现翻转
        }
    }
    return ret;
}

4.力扣1329

原题链接

https://leetcode.cn/problems/sort-the-matrix-diagonally/

题目概述

矩阵对角线 是一条从矩阵最上面行或者最左侧列中的某个元素开始的对角线,沿右下方向一直到矩阵末尾的元素。例如,矩阵 mat 有 6 行 3 列,从 mat[2][0] 开始的 矩阵对角线 将会经过 mat[2][0]、mat[3][1] 和 mat[4][2] 。

给你一个 m * n 的整数矩阵 mat ,请你将同一条 矩阵对角线 上的元素按升序排序后,返回排好序的矩阵。

解题思路

暂做记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值