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


前言

        
刷题坚持每一天,以下题目引用自:力扣(LeetCode)

💎一、题目一

🏆1.题目描述

原题链接:面试题 01.08. 零矩阵

        编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。

示例 1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]

🏆2.解题思路

🔑思路:

​         记录元素0所在的行和列,再次遍历矩阵,遍历的当前元素行或列是元素零的所在行或列直接给当前元素赋零值。

🏆3.代码详解

void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
    int i, j;
    int row[matrixSize];
    int line[matrixColSize[0]];
    memset(row, 0, sizeof(row));
    memset(line, 0, sizeof(line));

    for(i = 0; i < matrixSize; ++i){
        for(j = 0; j < matrixColSize[0]; ++j){
            if(matrix[i][j] == 0){
                row[i]++;
                line[j]++;
            }
        }
    }
    for(i = 0; i < matrixSize; ++i){
        for(j = 0; j < matrixColSize[0]; ++j){
            if(row[i] || line[j])
                matrix[i][j] = 0;
        }
    }
}

💎二、题目二

🏆1.题目描述

原题链接:73. 矩阵置零

        给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。

示例 1:
Alt
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

🏆2.解题思路

🔑思路:

​         记录元素0所在的行和列,再次遍历矩阵,遍历的当前元素行或列是元素零的所在行或列直接给当前元素赋零值。

🏆3.代码详解

void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
    int i, j;
    int row[matrixSize];
    int line[matrixColSize[0]];
    memset(row, 0, sizeof(row));
    memset(line, 0, sizeof(line));

    for(i = 0; i < matrixSize; ++i){
        for(j = 0; j < matrixColSize[0]; ++j){
            if(matrix[i][j] == 0){
                row[i]++;
                line[j]++;
            }
        }
    }
    for(i = 0; i < matrixSize; ++i){
        for(j = 0; j < matrixColSize[0]; ++j){
            if(row[i] || line[j])
                matrix[i][j] = 0;
        }
    }
}

💎三、题目三

🏆1.题目描述

原题链接:1727. 重新排列后的最大子矩阵

        给你一个二进制矩阵 matrix ,它的大小为 m x n ,你可以将 matrix 中的 列 按任意顺序重新排列。
        请你返回最优方案下将 matrix 重新排列后,全是 1 的子矩阵面积。

示例 1:
Alt
输入:matrix = [[0,0,1],[1,1,1],[1,0,1]]
输出:4
解释:你可以按照上图方式重新排列矩阵的每一列。
最大的全 1 子矩阵是上图中加粗的部分,面积为 4 。

🏆2.解题思路

🔑思路:

​        把矩阵的行元素依次叠加,到最后一层,前提是元素为一执行叠加操作。然后对每一行执行从大到小排序,每行排序完,对当前行的值(连续1的个数)进行矩阵面积运算,取最大。下列操作同上。

🏆3.代码详解

#define max(a, b)  ((a)>(b)?(a):(b))
int cmp(const void* q1, const void* q2){
    return *(int*)q2 - *(int*)q1;
}
int largestSubmatrix(int** matrix, int matrixSize, int* matrixColSize){
    for(int i = 1; i < matrixSize; ++i){
        for(int j = 0; j < matrixColSize[0]; ++j){
            if(matrix[i][j])
                matrix[i][j] += matrix[i-1][j];
        }
    }
    int ans = 0;
    for(int i = 0; i < matrixSize; ++i){
        qsort(matrix[i], matrixColSize[i], sizeof(int), cmp);
        for(int j = 0; j < matrixColSize[0]; ++j){
            printf("%d",matrix[i][j]);
            ans = max(ans, matrix[i][j]*(j+1));
        }
    }
    return ans;
}

💎四、题目四

🏆1.题目描述

原题链接:1034. 边界着色

给你一个大小为 m x n 的整数矩阵 grid ,表示一个网格。另给你三个整数 row、col 和 color 。网格中的每个值表示该位置处的网格块的颜色。
两个网格块属于同一 连通分量 需满足下述全部条件:

  • 两个网格块颜色相同
  • 在上、下、左、右任意一个方向上相邻

连通分量的边界 是指连通分量中满足下述条件之一的所有网格块:

  • 在上、下、左、右任意一个方向上与不属于同一连通分量的网格块相邻
  • 在网格的边界上(第一行/列或最后一行/列)

请你使用指定颜色 color 为所有包含网格块 grid[row][col] 的 连通分量的边界 进行着色,并返回最终的网格 grid 。

示例 1:
输入:grid = [[1,1],[1,2]], row = 0, col = 0, color = 3
输出:[[3,3],[3,2]]

🏆2.解题思路

🔑思路:

​         对给定元素值的上下左右进行比较是否相等,相等和给定元素同样处理,只要有一个方向不相等,给定元素是边界。在查找是否相等时注意矩阵的边界和对查找到相等的进行标记。

🏆3.代码详解

int hash[50][50];
bool dfs(int** grid, int rowSize, int colSize, int row, int col, int val, int color){
    
    if(row >= rowSize || row < 0 || col >= colSize || col < 0) return true; 
    if(hash[row][col]) return false;
    if(grid[row][col] != val) return true;
    hash[row][col] = 1;
    bool up = dfs(grid, rowSize, colSize, row, col-1, val, color);
    bool down = dfs(grid, rowSize, colSize, row, col+1, val, color);
    bool left = dfs(grid, rowSize, colSize, row-1, col, val, color);
    bool right = dfs(grid, rowSize, colSize, row+1, col, val, color);

    if(up || down || left || right) grid[row][col] = color;
    return false;
}
int** colorBorder(int** grid, int gridSize, int* gridColSize, int row, int col, int color, int* returnSize, int** returnColumnSizes){
    
    memset(hash, 0, sizeof(hash));
    dfs(grid, gridSize, gridColSize[0], row, col, grid[row][col], color);
    * returnSize = gridSize;
    * returnColumnSizes = gridColSize;
    return grid;
}

💎五、星球推荐

        星球链接:英雄算法联盟

星球里有什么?
        【朋友圈】一个极致精准的自律、编程、算法的小圈子。
        【算法集训】以月为单位组织算法集训,每天四题,风雨无阻。
        【排行榜】每天、每周都会有榜单,激励大家不断进步,不断成长。
        【个人规划】每个人都写好自己的规划,也可以查看他人的规划,时刻警醒自己不掉队。
        【打卡挑战】每日一题打卡、每日早起打卡、算法集训打卡、规划完成情况打卡。
在星球里做什么?
        目前星球人数达到520+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值