力扣73矩阵置零

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

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

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

要求原地,所以在原数组上处理,设置两个标志位,判断第一行和第一列是否有为0的元素。

然后再处理除了第一行第一列的其他元素,进行遍历,如果有为0的元素,将第一行第一列对应的位置分别设置为0。然后再遍历第一行第一列将元素为0对应的行列(非第一行第一列)设置为0。

最后单独处理第一行第一列,根据标志位判断是否应该全置0

class Solution {
    public void setZeroes(int[][] matrix) {
        boolean firstRowZero = false;
        boolean firstColZero = false;
        //先遍历第一行
        for (int i = 0; i < matrix[0].length; i++) {
            if (matrix[0][i] == 0) {
                firstRowZero = true;
                break;
            }
        }
        //遍历第一列
        for (int i = 0; i < matrix.length; i++) {
            if (matrix[i][0] == 0) {
                firstColZero = true;
                break;
            }
        }
        //处理剩余
        for(int i = 1; i< matrix.length; i++){
            for(int j = 1; j < matrix[0].length; j++){
                if(matrix[i][j] == 0){
                    //设置对应的第一行第一列对应的位置值为0
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }
        //处理第一行
        for(int i = 1; i < matrix[0].length; i++){
            if(matrix[0][i] == 0){
                for(int j = 1; j < matrix.length; j++){
                    matrix[j][i] = 0;
                }
            }
        }
        //处理第一列
        for(int i = 1; i < matrix.length; i++){
            if(matrix[i][0] == 0){
                for(int j = 1; j < matrix[0].length; j++){
                    matrix[i][j] = 0;
                }
            }
        }
        //处理
        if(firstRowZero){
            Arrays.fill(matrix[0], 0);
        }
        if(firstColZero){
            for(int i = 0; i < matrix.length; i++){
                matrix[i][0] = 0;
            }
        }

    }
}

### LeetCode 螺旋矩阵 II 的 C 语言实现 螺旋矩阵 II 需要在一个 n×n 的二维数组中按顺时针方向填充从 1 到 n² 的数字。以下是该问题的一种高效解决方法: ```c /** * Return an array of arrays of size *returnSize. * The sizes of the arrays are returned as *returnColumnSizes array. */ int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){ *returnSize = n; *returnColumnSizes = malloc(sizeof(int) * n); int **matrix = (int **)malloc(n * sizeof(int *)); for (int i = 0; i < n; ++i) { matrix[i] = (int *)calloc(n, sizeof(int)); (*returnColumnSizes)[i] = n; } int num = 1; int layers = (n + 1) / 2; for (int layer = 0; layer < layers; ++layer) { // Top row from left to right for (int col = layer; col < n - layer && num <= n * n; ++col) matrix[layer][col] = num++; // Right column from top to bottom for (int row = layer + 1; row < n - layer && num <= n * n; ++row) matrix[row][n - layer - 1] = num++; // Bottom row from right to left for (int col = n - layer - 2; col >= layer && num <= n * n; --col) matrix[n - layer - 1][col] = num++; // Left column from bottom to top for (int row = n - layer - 2; row > layer && num <= n * n; --row) matrix[row][layer] = num++; } return matrix; } ``` 此算法采用分层的方式逐圈填充矩阵,每完成一圈就向内收缩一层直到填满整个矩阵[^1]。 #### 关键点解析 - 函数接收参数 `n` 表示矩阵大小,并返回一个已经按照题目要求填充好的二维数组。 - 使用四个循环分别处理每一圈中的上边、右边、下边以及左边的数据填充工作。 - 特别注意边界条件的判断以防止越界访问或重复赋值的情况发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值