《五月集训》第十一天——矩阵


前言

        矩阵在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:
Alt
输入: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+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值