第七天!!!!
——————————————————————————————————————————————————————————————————————————————————————————————————————————
学习内容:
1.
矩阵->二维数组
矩阵翻转 旋转 转置
例子代码:
#include<stdio.h>
int main()
{
int nums[3][4]={1,2,3,4,
5,6,7,8,
9,10,11,12};
printf("原矩阵:\n");
for(int i=0;i<3;i++){
for(int j=0;j<4;j++)
printf("%-2d ",nums[i][j]);
putchar('\n');
}
putchar('\n');
printf("水平翻转后的矩阵:\n");
for(int i=0;i<3;i++){
for(int j=3;j>=0;j--)
printf("%-2d ",nums[i][j]);
putchar('\n');
}
putchar('\n');
printf("垂直翻转后的矩阵:\n");
for(int i=2;i>=0;i--){
for(int j=0;j<4;j++)
printf("%-2d ",nums[i][j]);
putchar('\n');
}
putchar('\n');
printf("顺时针旋转后的矩阵:\n");
for(int i=0;i<4;i++){
for(int j=2;j>=0;j--)
printf("%-2d ",nums[j][i]);
putchar('\n');
}
putchar('\n');
printf("逆时针旋转后的矩阵:\n");
for(int i=3;i>=0;i--){
for(int j=0;j<3;j++)
printf("%-2d ",nums[j][i]);
putchar('\n');
}
putchar('\n');
printf("转置(对矩阵的主对角线对称的元素进行交换)后的矩阵:\n");
for(int i=0;i<4;i++){
for(int j=0;j<3;j++)
printf("%-2d ",nums[j][i]);
putchar('\n');
}
putchar('\n');
}
2.二维数组的函数传参
例子:
int diagonalSum(int **mat,int matSize,int *matColSize){
}
mat 数组名—>数组首行地址
matSize 有多少行,我理解为有多少个一维数组
*matColSize 每个一维数组中有多少个元素
————————————————————————————————————————————
课后习题:
1.力扣 351. 统计有序矩阵中的负数
int countNegatives(int** grid, int gridSize, int* gridColSize){
int count=0;
for(int i=0;i<gridSize;i++)
for(int j=0;j<*gridColSize;j++)
if(grid[i][j]<0)
count++;
return count;
}
2.力扣 572.矩阵对角线元素的和
int diagonalSum(int** mat, int matSize, int* matColSize){
int sum=0;
for(int i=0;i<matSize;i++)
for(int j=0;j<*matColSize;j++)
if(i==j||i+j==matSize-1)
sum+=mat[i][j];
return sum;
}
3.力扣 672.最富有客户的资产总量
int maximumWealth(int** accounts, int accountsSize, int* accountsColSize){
int max=0;
int sum=0;
for(int i=0;i<accountsSize;i++){
sum=0;
for(int j=0;j<*accountsColSize;j++)
sum+=accounts[i][j];
max=max>sum?max:sum;
}
return max;
}
4.力扣 766. 托普利茨矩阵
bool isToeplitzMatrix(int** matrix, int matrixSize, int* matrixColSize){
if(matrixColSize<=1||*matrixColSize<=1)
return true;
for(int i=1;i<matrixSize;i++)
for(int j=1;j<*matrixColSize;j++)
if(matrix[i-1][j-1]!=matrix[i][j])
return false;
return true;
}
5.力扣 1380.矩阵中的幸运数
思路:先找出第一行最小的元素,并且记录他是第几列的,然后遍历看他是不是这列
最大的元素,是就break退出,不是则继续查找
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* luckyNumbers (int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
int INj;
int is=1;
int min;
int *ret=(int *)malloc(sizeof(int));
int count=0;
for(int i=0;i<matrixSize;i++){
is=1;
min=matrix[i][0];
INj=0;
for(int j=1;j<*matrixColSize;j++)
{
if(min>matrix[i][j]){
min=matrix[i][j];
INj=j;
}
}
for(int k=0;k<matrixSize;k++)
{
if(min<matrix[k][INj])
is=0;
}
if(is==1){
*ret=min;
count++;
break;
}
}
*returnSize=count;
return ret;
}
6.力扣 1582.二进制矩阵中的特殊位置
思路:先遍历一行,找出1的个数,如果这一行1的个数是1,
才进行下一步判断,不是1个的话,就查找下一行,如果找到只有一个1的那一行,
就判断他这一列是不是只有他1个1,是的话计数加一,不是就再次查找。
int numSpecial(int** mat, int matSize, int* matColSize){
int isi,isj;
int INj;
int count=0;
for(int i=0;i<matSize;i++){
isi=0;
isj=0;
for(int j=0;j<*matColSize;j++){
if(mat[i][j]==1){
isj++;
INj=j;
}
}
if(isj==1){
for(int k=0;k<matSize;k++){
if(mat[k][INj]==1)
isi++;}
}
if(isi==1&&isj==1)
count++;
}
return count;
}
7.力扣 463.岛屿的周长
思路:遍历判断(上下左右)遇到边界或者0我周长就加一!
int islandPerimeter(int** grid, int gridSize, int* gridColSize){
int count=0;
for(int i=0;i<gridSize;i++){
for(int j=0;j<*gridColSize;j++){
if(grid[i][j]==1)
{
if(i==0)
count++;
if(j==0)
count++;
if(i==gridSize-1)
count++;
if(j==*gridColSize-1)
count++;
if(i!=0&&grid[i-1][j]==0)count++;
if(i!=gridSize-1&&grid[i+1][j]==0)count++;
if(j!=0&&grid[i][j-1]==0)count++;
if(j!=*gridColSize-1&&grid[i][j+1]==0)count++;
}
}
}
return count;
}
——————————————————————————————————————————
总结:今天又晚啦些,但今天都是自己搞出来的,不错不错明天加油!(不过我晚睡有女朋友陪,你们呢?哈哈哈哈)