【五月集训】

【五月集训】第十一天作业——矩阵

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;
}

结束: 跟练第二天,感觉还不错, 继续加油!现在只是基本解题思路, 后续要进行相应的代码优化~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值