【五月集训】第十一天作业——矩阵
1351. 统计矩阵中的负数
分析及思路:遍历二维数组, 如果出现负数, ans+1, 最后 ans即负数的个数
intcountNegatives(int** grid, intgridSize, int* gridColSize){
intr = gridSize;
intc = *gridColSize;
inti, j, ans = 0;
for(i = 0; i < r; i++){
for(j = 0; j < c; j ++){
if(grid[i][j] < 0) ans += 1;
}
}
returnans;
}
1672. 最富有客户的资产总量
思路: 求矩阵 和最大的行, 遍历每一行计算和, 取最大
intmaximumWealth(int** accounts, intaccountsSize, int* accountsColSize){
intr = accountsSize, c = *accountsColSize;
inti, j, ans = 0;
for(i = 0; i < r; i++){
intsum = 0;
for(j = 0; j < c; j++){
sum += accounts[i][j];
}
ans = (ans >= sum)?ans:sum;
}
returnans;
}
0832. 翻转图像
分析及思路:翻转:1. 水平翻转 即可以看做每行的 第j列和 c-j-1列进行交换 2. 取反:因为数值只有0、1,所以可以通过异或1进行取反(1^1 = 0, 0^1 = 1)
(l 与r 表示要交换的两列):若 l == r, 不用交换, 直接取反即可;
否则:若 a[i][l] == a[i][r], 两边直接取反即可; 否则, 不用变
int** flipAndInvertImage(int** image, intimageSize, int* imageColSize, int* returnSize, int** returnColumnSizes){
*returnSize = imageSize;
*returnColumnSizes = imageColSize;
int n = imageSize;
int i;
for(i = 0; i < n; i++){
intl = 0, r = n - 1;
while(l < r){
if(image[i][l] == image[i][r]){
// 直接0->1 , 1->0
image[i][l] ^= 1;
image[i][r] ^= 1;
}else{
// 交换 & 取反 = 不变
}
l++, r--;
}
if(l == r){
image[i][l] ^= 1;
}
}
return image;
}
1329. 将矩阵按对角线排序
分析及思路:设计知识点: 二维数组、排序(本次使用冒泡排序)
1. 要将矩阵对角线排序主要分为三步:
a. 取出矩阵对角线元素
b. 将这些元素排序
c. 将排序后的元素放回对角线
2 . 遍历矩阵对角线
a. 从a[0][0]依次向右遍历
b. 从a[1][0]依次向左遍历
voidswap(int *a, int *b){
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
voidsort(int *temp, int k){
if(k==1) return;
int i, j, flag = 1;
for(i = 0; i < k - 1 && flag; i++){
flag = 0;
for(j = 0; j < k - i -1; j++){
if(temp[j] > temp[j+1]){
swap(&temp[j], &temp[j+1]);
flag = 1;
}
}
}
}
int** diagonalSort(int** mat, int matSize, int* matColSize, int* returnSize, int** returnColumnSizes){
*returnSize = matSize;
*returnColumnSizes = matColSize;
// 开辟一个临时数组, 可以存*matColSize个元素, 并初始化为0
int *tempMat = (int *)calloc( (*matColSize), sizeof(int));
// 1. 按列
int col = 0;
while(col < *matColSize){
int i, j, k = 0;
for(i = 0, j = col; i < matSize && j < *matColSize; i++, j++){
tempMat[k++] = mat[i][j];
}
sort(tempMat, k);
k = 0;
for(i = 0, j = col; i < matSize && j < *matColSize; i++, j++){
mat[i][j] = tempMat[k++];
}
col++;
}
// 2. 按行
int r = 1;
while(r < matSize){
inti, j, cnt = 0, k = 0;
for(i = r, j = 0; i < matSize && j < *matColSize; i++, j++){
tempMat[k++] = mat[i][j];
}
sort(tempMat, k);
k = 0;
for(i = r, j = 0; i < matSize && j < *matColSize; i++, j++){
mat[i][j] = tempMat[k++];
}
r++;
}
free(tempMat);
return mat;
}
结束: 跟练第二天,感觉还不错, 继续加油!现在只是基本解题思路, 后续要进行相应的代码优化~