跟着英雄学算法--矩阵

目录

1.力扣题分析

2.最富有客户的资产总量

3.转置矩阵 

4.旋转图像

5.回旋矩阵(方阵)


矩阵力扣题讲解

二进制二维数组image水平反转在取反

int** flipAndInvertImage(int** image, int imageSize, int* imageColSize, int* returnSize, int** returnColumnSizes){
    int i, j, col;
    int **ret = (int **)malloc( sizeof(int *) * imageSize );        // (1)
    *returnColumnSizes = (int *)malloc( sizeof(int) * imageSize );  // (2)
    for(i = 0; i < imageSize; ++i) {
        col = imageColSize[i];                                      // (3)
        ret[i] = (int *)malloc( sizeof(int) * col );                // (4)
        (*returnColumnSizes)[i] = col;                              // (5)
        for(j = 0; j < col; ++j) {
            ret[i][j] = 1 - image[i][ col-1-j ];                    // (6)
        }
    }
    *returnSize = imageSize;                                        // (7)
    return ret;                                                     // (8)
}

image是传过来二维数组,

imagesize是传过来的二维数组的行数,

imagecolsize是传过来二维数组每行的列数

returnSize是传回去二维数组的行数

returnColumnSizes是传回去二维数组每行的列数

返回的时候要malloc一个二维数组来接收

同时每行也要malloc处每行的元素个数(最后malloc完二维数组后,就对每个一维数组进行malloc)

 1.最富有客户的资产总量

给你一个 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:

输入:accounts = [[1,5],[7,3],[3,5]]
输出:10
解释:
第 1 位客户的资产总量 = 6
第 2 位客户的资产总量 = 10 
第 3 位客户的资产总量 = 8
第 2 位客户是最富有的,资产总量是 10

示例 3:

输入:accounts = [[2,8,7],[7,1,3],[1,9,5]]
输出:17

思路:求出每行的和,再将每行和进行比较,求出最大值进行返回

int maximumWealth(int** accounts, int accountsSize, int* accountsColSize){
int i,j,col;
int arr[accountsSize];//用一个arr数组来接收每行和
memset(arr,0,accountsSize*sizeof(int));同时要对他初始化为0

int max;//定义max为最终最大返回值
for(i=0;i<accountsSize;i++)
{
    
    for(j=0;j<accountsColSize[i];j++)
    {
        arr[i]+=accounts[i][j];
    } 
}
max=arr[0];//max赋初值第一个元素
for(i=0;i<accountsSize;i++)
{
    if(max<arr[i])
    {
        max=arr[i];
    }
}
return max;

}

转置矩阵 

给你一个二维整数数组 matrix, 返回 matrix转置矩阵

矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[1,4,7],[2,5,8],[3,6,9]]

示例 2:

输入:matrix = [[1,2,3],[4,5,6]]
输出:[[1,4],[2,5],[3,6]]

 思路:对角线互换,行变列,列变行

 1.returnsize返回的是转置后返回的二维数组的行数;

2.*returnColumnSizes是返回的二维数组的每行的列数

3.返回的二维数组必须自己malloc出来,同时返回的二维数组每一行的元素也要自己malloc出来,

/**
 * 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** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes)
{
int i,j,col;    
col=matrixColSize[0];//
int **ret=(int **)malloc(sizeof(int*)*col);      //ret的行数是matrix的列数
*returnColumnSizes=(int*)malloc(sizeof(int)*col);//*returnColumnSize返回的每行的个数是原二维数组的列数
*returnSize=col;      //返回的行数是原来的列数                        
for(i=0;i<col;i++)      
{          
    (*returnColumnSizes)[i]=matrixSize;//返回每行的列数是原来的行数
    ret[i]=(int *)malloc(sizeof(int)*matrixSize);
}
for(i=0;i<matrixSize;i++)
{    
    for(j=0;j<col;j++)
    {
        ret[j][i]=matrix[i][j];
    }
}
return ret;
}

旋转图像 

给定一个 × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

示例 3:

输入:matrix = [[1]]
输出:[[1]]

示例 4:

输入:matrix = [[1,2],[3,4]]
输出:[[3,1],[4,2]]
void rotate(int** matrix, int matrixSize, int* matrixColSize){
int i=0;
int j=0;
int col;
int arr[matrixSize][matrixSize];//开辟一个arr二维数组,长度是matrixsize
for(i=0;i<matrixSize;i++)
{
    col=matrixColSize[i];       //col是每行的列数
for(j=0;j<col;j++)
{
    arr[j][col-1-i]=matrix[i][j];//因为是对matrix的i和j的遍历,所以matrix是[i][j],
                                   arr是规律是arr[j][col-1-i]
}
}
for(i=0;i<matrixSize;i++)
{
    col=matrixColSize[i];
    for(j=0;j<col;j++)
    {
        matrix[i][j]=arr[i][j];//arr是已经旋转之后的数组,同时因为要旋转,所以要对原来的数组进行改变,把arr赋给matrix
    }
}
return matrix;
}

 回旋矩阵

int main()
{
	int i, j;
	int m = 3;
	int n = 3;

	int ret[10][10];
	memset(ret, 0, sizeof(ret));用memset内存函数对ret初始化为0
	

	int count = 1;
	for (i = 0; i < n / 2; i++)
	{
		
		//向右
		for (j = i; j < m - i; j++)
		{
			ret[i][j] = count++;
		}
		//向下
		for (j = i + 1; j < n - i; j++)
		{
			ret[j][m - 1 - i] = count++;
		}
		for (j = m - 2 - i; j >= i; j--)
		{
			ret[n - 1 - i][j] = count++;
		}
		for (j = n - 2 - i; j > i; j--)

		{

			ret[j][i] = count++;
		}
		if (n % 2 == 1)//假如n是奇数的话,中间还要填一个数
		{
			ret[n / 2][m / 2] = n * m;
		}

	}
	
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			printf("%d ", ret[i][j]);
		}
		printf("\n");
	}

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zevin~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值