前言
这是五月集训的第十一日,今日的训练内容是 矩阵
解题报告
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 ,请你将同一条 矩阵对角线 上的元素按升序排序后,返回排好序的矩阵。
解题思路
暂做记录。