文章目录
前言
矩阵在c语言里表现形式就是二维数组。
刷题坚持每一天,以下题目引用自:力扣(LeetCode)
💎一、题目一
🏆1.题目描述
原题链接:1351. 统计有序矩阵中的负数
给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。 请你统计并返回 grid 中 负数 的数目。
示例 1:
输入:grid = [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]
输出:8
解释:矩阵中共有 8 个负数。
🏆2.解题思路
🔑思路:
遍历这个二维数组,统计小于零的数量。
🏆3.代码详解
int countNegatives(int** grid, int gridSize, int* gridColSize){
int i, j;
int ans = 0;
for(i = 0; i < gridSize; ++i){
for(j = 0; j < gridColSize[0]; ++j){
if(grid[i][j] < 0) ++ans; // 或 ans += grid[i][j] < 0 ? 1 : 0;
}
}
return ans;
}
💎二、题目二
🏆1.题目描述
原题链接:1672. 最富有客户的资产总量
给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。
客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。
示例 1:
输入:accounts = [[1,2,3],[3,2,1]]
输出:6
解释:
第 1 位客户的资产总量 = 1 + 2 + 3 = 6
第 2 位客户的资产总量 = 3 + 2 + 1 = 6
两位客户都是最富有的,资产总量都是 6 ,所以返回 6 。
🏆2.解题思路
🔑思路:
统计每一行的总数,比较得出最大值。
🏆3.代码详解
int maximumWealth(int** accounts, int accountsSize, int* accountsColSize){
int i, j;
int sum = 0, max = 0;
for(i = 0; i < accountsSize; ++i){
sum = 0;
for(j = 0; j < accountsColSize[0]; ++j){
sum += accounts[i][j];
}
if(max < sum) max = sum;
}
return max;
}
💎三、题目三
🏆1.题目描述
原题链接:832. 翻转图像
给定一个 n x n 的二进制矩阵 image ,先 水平 翻转图像,然后 反转 图像并返回 结果 。
水平 翻转图片就是将图片的每一行都进行翻转,即逆序。
例如,水平翻转 [1,1,0] 的结果是 [0,1,1]。
反转 图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替换。
例如,反转 [0,1,1] 的结果是 [1,0,0]。
示例 1:
输入:image = [[1,1,0],[1,0,1],[0,0,0]]
输出:[[1,0,0],[0,1,0],[1,1,1]]
解释:首先翻转每一行: [[0,1,1],[1,0,1],[0,0,0]];
然后反转图片: [[1,0,0],[0,1,0],[1,1,1]]
🏆2.解题思路
🔑思路:
反向遍历每一行同时进行取反,放进新数组。
🏆3.代码详解
int** flipAndInvertImage(int** image, int imageSize, int* imageColSize, int* returnSize, int** returnColumnSizes){
int** ans = (int**)malloc(sizeof(int*)*imageSize);
int i, j;
for(i = 0; i < imageSize; ++i){
ans[i] = (int*)malloc(sizeof(int)*imageColSize[i]);
for(j = imageColSize[i]-1; j >= 0; j--){
ans[i][imageColSize[i]-1-j] = image[i][j] ^ 1;
}
}
* returnColumnSizes = imageColSize;
* returnSize = imageSize;
return ans;
}
💎四、题目四
🏆1.题目描述
原题链接:1329. 将矩阵按对角线排序
矩阵对角线 是一条从矩阵最上面行或者最左侧列中的某个元素开始的对角线,沿右下方向一直到矩阵末尾的元素。例如,矩阵 mat 有 6 行 3 列,从 mat[2][0] 开始的 矩阵对角线 将会经过 mat[2][0]、mat[3][1] 和 mat[4][2] 。
给你一个 m * n 的整数矩阵 mat ,请你将同一条 矩阵对角线 上的元素按升序排序后,返回排好序的矩阵。
示例 1:
输入:mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
输出:[[1,1,1,1],[1,2,2,2],[1,2,3,3]]
🏆2.解题思路
🔑思路:
对矩阵对角线元素遍历取出并进行排序,排序完成,再按对角线元素遍历放进去。
🏆3.代码详解
#define min(x, y) (x) > (y) ? (y) : (x)
int cmp(const void *a, const void *b){
return *(int*)a - *(int*)b;
}
void Sort(int **mat, int m, int n, int row, int col){//将斜对角的元素取出进行排序,然后再放回mat中
int len = min(m - row, n - col);
int* ans = (int*)malloc(sizeof(int)*len);
int count = 0;
int i = row, j = col;
while(i < m && j < n){
ans[count] = mat[i][j];
++i;
++j;
++count;
}
qsort(ans, count, sizeof(int), cmp);
count = 0;
i = row;
j = col;
while(i < m && j < n){
mat[i][j] = ans[count];
++i;
++j;
++count;
}
free(ans);
}
int **diagonalSort(int **mat, int matSize, int *matColSize, int *returnSize, int **returnColumnSizes){
*returnSize = matSize;
*returnColumnSizes = matColSize;
int m = matSize;
int n = *matColSize;
for(int i = m-1; i >= 0; --i){
Sort(mat, m, n, i, 0);
}
for(int j = 1; j < n; ++j){
Sort(mat, m, n, 0, j);
}
return mat;
}
💎五、星球推荐
星球链接:英雄算法联盟
星球里有什么?
【朋友圈】一个极致精准的自律、编程、算法的小圈子。
【算法集训】以月为单位组织算法集训,每天四题,风雨无阻。
【排行榜】每天、每周都会有榜单,激励大家不断进步,不断成长。
【个人规划】每个人都写好自己的规划,也可以查看他人的规划,时刻警醒自己不掉队。
【打卡挑战】每日一题打卡、每日早起打卡、算法集训打卡、规划完成情况打卡。
在星球里做什么?
目前星球人数达到390+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。