我是靠谱客的博主 迅速花瓣,最近开发中收集的这篇文章主要介绍《LeetCode零基础指南》(第八讲) 二维数组一.知识点二.习题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

一.知识点

二.习题

1351. 统计有序矩阵中的负数

题目描述

1572. 矩阵对角线元素的和

题目描述

1672. 最富有客户的资产总量

题目描述

1672. 766. 托普利茨矩阵

题目描述

1380. 矩阵中的幸运数

题目描述

1582. 二进制矩阵中的特殊位置

题目描述

463. 岛屿的周长


一.知识点

    1.二维数组的函数传参

int diagonalSum(int** mat, int matSize, int* matColSize){
}

其中第一个matSize代表行数,而matColSize代表的是每行的元素个数。所以是一个数组matColSize[0]就是第0行有多少个元素。
一般写法 

int diagonalSum(int** mat, int matSize, int* matColSize){
   r = matSize;
   c = matColSize[0];
   // TODO
}

 

二.习题

1351. 统计有序矩阵中的负数

 1351. 统计有序矩阵中的负数

 

题目描述

    给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。
    请你统计并返回 grid 中 负数 的数目。

 

示例 :

            [1,0,0]
            [0,0,1]
            [1,0,0]
输出:1
解释:(1,2) 是一个特殊位置,因为 mat[1][2] == 1 且所处的行和列上所有其他元素都是 0

int countNegatives(int** grid, int gridSize, int* gridColSize){
    int i, j, ans = 0;              
    int r = gridSize;              // (1)
    int c = gridColSize[0];
    for(i = 0; i < r; ++i) {
        for(j = 0; j < c; ++j) {
            if(grid[i][j] < 0) {
                ++ans;             // (2)
            } 
        }
    }
    return ans;
}

1572. 矩阵对角线元素的和

1572. 矩阵对角线元素的和

题目描述

给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。
请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。

示例:

            1,2,3
            4,5,6
            7,8,9
输出:25
解释:对角线的和为:1 + 5 + 9 + 3 + 7 = 25
请注意,元素 mat[1][1] = 5 只会被计算一次。

int diagonalSum(int** mat, int matSize, int* matColSize){
    int r = matSize;                 // (1)
    int c = matColSize[0];
    int i;
    int ans = 0;
    for(i = 0; i < r; ++i) {
        ans += mat[i][i];            // (2)
    }
    for(i = 0; i < r; ++i) {
        if(r-i-1 != i) {
            ans += mat[i][r-i-1];    // (3)
        }
    }
    return ans;
}

1672. 最富有客户的资产总量

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。

int maximumWealth(int** accounts, int accountsSize, int* accountsColSize){
    int i, j;
    int maxv = -1, maxIdx, sumv;
    for(i = 0; i < accountsSize; ++i) {
        sumv = 0;
        for(j = 0; j < *accountsColSize; ++j) {
            sumv += accounts[i][j];             // (1)
        }
        if(sumv > maxv) {
            maxv = sumv;                        // (2)
            maxIdx = i;
        }
    }
    return maxv;
}

1672. 766. 托普利茨矩阵

766. 托普利茨矩阵

题目描述

给你一个m x n的矩阵matrix。如果这个矩阵是托普利茨矩阵,返回 true;否则,返回false
如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。

示例:

输入:matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]]
输出:true
解释:
在上述矩阵中, 其对角线为:
"[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]"。
各条对角线上的所有元素均相同, 因此答案是 True

int checkSame(int** matrix, int sr, int sc, int maxr, int maxc) {  // (1)
    int step = 0;
    while(1) {
        if(sr + step >= maxr) {
            break;                                                 // (2)
        }
        if(sc + step >= maxc) {
            break;                                                 // (3)
        }
        if(matrix[sr+step][sc+step] != matrix[sr][sc]) {           // (4)
            return false;
        }
        ++step;                                                    // (5)
    }
    return true;                                                   // (6)
}

bool isToeplitzMatrix(int** matrix, int matrixSize, int* matrixColSize){
    int r = matrixSize;
    int c = matrixColSize[0];
    int i;
    for(i = 0; i < c; ++i) {
        if( !checkSame(matrix, 0, i, r, c) ) {                     // (7)
            return false;  
        }        
    }
    for(i = 0; i < r; ++i) {
        if( !checkSame(matrix, i, 0, r, c) ) {                     // (8)
            return false;
        }    
    }
    return true;
}

1380. 矩阵中的幸运数

1380. 矩阵中的幸运数

题目描述

给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。
幸运数是指矩阵中满足同时下列两个条件的元素:

  • 在同一行的所有元素中最小
  • 在同一列的所有元素中最大

示例 :

输入:matrix = [[3,7,8],[9,11,13],[15,16,17]]
输出:[15]
解释:15 是唯一的幸运数,因为它是其所在行中的最小值,也是所在列中的最大值

int min(int a, int b) {
    return a < b ? a : b;
}
int max(int a, int b) {
    return a > b ? a : b;
}

int* luckyNumbers (int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
    int i, j;
    int r = matrixSize;
    int c = matrixColSize[0];
    int rmin[100];
    int cmax[100];
    int *ret = (int *)malloc( sizeof(int) * r * c );

    for(i = 0; i < r; ++i) {
        rmin[i] = 1000000;
        for(j = 0; j < c; ++j) {
            rmin[i] = min(rmin[i], matrix[i][j]);             // (1)
        }
    }
    for(j = 0; j < c; ++j) {
        cmax[j] = 0;
        for(i = 0; i < r; ++i) {
            cmax[j] = max(cmax[j], matrix[i][j]);             // (2)
        }
    }
    *returnSize = 0;
    for(i = 0; i < r; ++i) {
        for(j = 0; j < c; ++j) {
            if(matrix[i][j] == rmin[i] && matrix[i][j] == cmax[j]) {
                ret[ (*returnSize)++ ] = matrix[i][j];       // (3)
            }
        }
    }
    return ret;
}

1582. 二进制矩阵中的特殊位置

1582. 二进制矩阵中的特殊位置

题目描述

    给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。
    网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
    岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

示例 1:

输入: 1,0,0
            0,0,1
            1,0,0
输出:1
解释:(1,2) 是一个特殊位置,因为 mat[1][2] == 1 且所处的行和列上所有其他元素都是 0

 

int check(int** mat, int matSize, int matColSize, int r, int c) {
    int i;
    if(mat[r][c] != 1) {
        return 0;                                           // (1)
    }
    for(i = 0; i < matSize; ++i) {
        if(i != r && mat[i][c]) {
            return 0;                                       // (2)
        }
    }
    for(i = 0; i < matColSize; ++i) {
        if(i != c && mat[r][i]){
            return 0;                                       // (3)
        }
    }
    return 1;                                               // (4)
}

int numSpecial(int** mat, int matSize, int* matColSize){    // (5)
    int i, j;
    int sum = 0;
    for(i = 0; i < matSize; ++i) {
        for(j = 0; j < matColSize[i]; ++j) {              
            sum += check(mat, matSize, matColSize[i], i, j); // (6)
        }
    }
    return sum;
}

463. 岛屿的周长

463. 岛屿的周长

题目描述

给你一个大小为 rows x cols 的矩阵 mat,其中 mat[i][j] 是 0 或 1,请返回 矩阵 mat 中特殊位置的数目 。

示例:

输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
输出:16
解释:它的周长是上面图片中的 16 个黄色的边

int islandPerimeter(int** grid, int gridSize, int* gridColSize){
    int ans = 0;
    for(int i = 0;i < gridSize;i++)
        for(int j = 0;j < gridColSize[0];j++)
            if(grid[i][j] == 1){
                int temp = 4;
                if(i > 0 && grid[i-1][j])   temp--;
                if(i < (gridSize - 1) && grid[i+1][j])  temp--;
                if(j > 0 && grid[i][j-1])   temp--;
                if(j < (gridColSize[0] - 1) && grid[i][j+1])    temp--;
                ans+=temp;
            }
    return ans;
}

最后

以上就是迅速花瓣为你收集整理的《LeetCode零基础指南》(第八讲) 二维数组一.知识点二.习题的全部内容,希望文章能够帮你解决《LeetCode零基础指南》(第八讲) 二维数组一.知识点二.习题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部