【解题报告】《LeetCode零基础指南》(第九讲) 二级指针(1)

简介: 【解题报告】《LeetCode零基础指南》(第九讲) 二级指针(1)

☘前言☘

今天是九日集训第八天,我会记录一下学习内容和题解,争当课代表0.0.

链接:《LeetCode零基础指南》(第九讲) 二级指针


🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人

✨联系方式:2201891280(QQ)

⏳全文大约阅读时间: 20min


全文目录

 ☘前言☘

 🎁主要知识点梳理

            📝1.二级指针

            🍤2.解引用

            🍡3.力扣中的二级指针

            🍧4.内存申请模板

 🍗课后习题

            832. 翻转图像

            867. 转置矩阵

            566. 重塑矩阵

            2022. 将一维数组转变成二维数组

            1260. 二维网格迁移

            661. 图片平滑器

            1314. 矩阵区域和

            1030. 距离顺序排列矩阵单元格

 🍦写在最后

🎁主要知识点梳理

📝1.二级指针

指针变量也是一种变量,也会占用存储空间,也可以用&获取它的地址。

如果一个指针指向另一个指针,我们就称它位二级指针。


int x = 1;
int *p1 = &x;
int **p2 = &p1;


当然,套娃的思想,三级指针和四级指针也是有的。不过不怎么常用。


int ***p3 = & p2;
int ****p4 = &p3;


🍤2.解引用

在学习一级指针的时候,我们用*进行解引用,变成普通变量,二级指针经过一次解引用,变成一级指针。


🍡3.力扣中的二级指针

在力扣中,选择用c语言进行求解的时候,往往是下面的传参型势,是什么意思呢?


int** func(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes){
}

8c48d2d6ff38d45a5442e538f36a328.png


🍧4.内存申请模板

int **myMalloc(int r, int c, int* returnSize, int** returnColumnSizes) {
    int i;
    int **ret = (int **)malloc( sizeof(int *) * r );       
    *returnColumnSizes = (int *)malloc( sizeof(int) * r ); 
    *returnSize = r;                                       
    for(i = 0; i < r; ++i) {
        ret[i] = (int *)malloc( sizeof(int) * c );         
        (*returnColumnSizes)[i] = c;                       
    }    
    return ret;
}


🍗课后习题

832. 翻转图像

832. 翻转图像


题目描述


给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。

水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。

反转图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替换。例如,反转 [0, 1, 1] 的结果是 [1, 0, 0]。


思路


按照要求进行翻转就好了,但是需要注意的是如果是正中间的元素,直接进行反转就好了。


int** flipAndInvertImage(int** image, int imageSize, int* imageColSize, int* returnSize, int** returnColumnSizes){
    *returnSize = imageSize;
    *returnColumnSizes = imageColSize;
    int n = imageSize,m = *imageColSize;
    //printf("%d %d",imageSize,*imageColSize);
    for (int i = 0; i < n; i++)    
        for(int j = 0; j < (m + 1) / 2; ++j){
            if(j == m/2)    image[i][j] = !image[i][j];
            else{
                image[i][j] = image[i][j] ^ image[i][m - 1 - j];
                image[i][m - 1 - j] =  image[i][j] ^ image[i][m - 1 - j];
                image[i][j] = image[i][j] ^ image[i][m - 1 - j];
                image[i][j] = !image[i][j];
                image[i][m - 1 - j] = !image[i][m - 1 - j];
            }
        }
    return image;
}


867. 转置矩阵

867. 转置矩阵


题目描述


给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。

矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。


思路


直接按照转置的规则就行新数组的填充就好了。


int** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes){
    int m = matrixSize,n = *matrixColSize;
    int **ans = malloc(sizeof(int *) * n);
    *returnSize = n;
    *returnColumnSizes = malloc(sizeof(int) * (*returnSize));
    for(int i = 0; i < *matrixColSize; ++i){
        ans[i] = malloc(sizeof(int) * m);
        (*returnColumnSizes)[i] = matrixSize;
    }
    for(int i = 0; i < matrixSize; ++i)
        for(int j = 0;j < *matrixColSize; ++j)
            ans[j][i] = matrix[i][j];
    return ans;
}


566. 重塑矩阵

566. 重塑矩阵


题目描述


在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。

给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数

重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。

如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。


思路


先判断元素一样不,不一样直接返回原始数组。一样的话话按照规则进行填充就好了。


int** matrixReshape(int** mat, int matSize, int* matColSize, int r, int c, int* returnSize, int** returnColumnSizes){
    if(r*c != matColSize[0]*matSize){
        *returnSize = matSize;
        (*returnColumnSizes) = malloc(sizeof(int)*matSize);
        for(int i =0;i < matSize;i++)   (*returnColumnSizes)[i] = matColSize[i];
        return mat;
    }
    int **ans = malloc(sizeof(int *) * r);
    (*returnColumnSizes) = malloc(sizeof(int) * r);
    for(int i = 0;i < r;i++)    (*returnColumnSizes)[i] = c;
    int col = 0,num = 0;
    for(int i = 0;i < r;i++)    ans[i] = malloc(sizeof(int)*c);
    for(int i = 0;i < matSize;i++)
        for(int j = 0;j <matColSize[0];j++){
            ans[col][num++] = mat[i][j];
            if(num == c)    col++,num = 0;
            //printf("%d %d",col,num);
        }
    *returnSize = r;
    return ans;
}

2022. 将一维数组转变成二维数组

2022. 将一维数组转变成二维数组


题目描述


给你一个下标从 0 开始的一维整数数组original和两个整数m和 n 。你需要使用original中 所有 元素创建一个 m 行 n 列的二维数组。

original中下标从0 到n - 1(都 包含 )的元素构成二维数组的第一行,下标从 n到 2 * n - 1(都 包含 )的元素构成二维数组的第二行,依此类推。

请你根据上述过程返回一个 m x n 的二维数组。如果无法构成这样的二维数组,请你返回一个空的二维数组。


思路


其实和上面那道题基本上意思是一样的。


int** construct2DArray(int* original, int originalSize, int m, int n, int* returnSize, int** returnColumnSizes){
    if(originalSize != m*n ){
        *returnSize = 0;
        return NULL;
    }
    int ** ans = malloc(sizeof(int *) * m);
    *returnSize = m;
    *returnColumnSizes = malloc(sizeof(int) * m);
    for(int i = 0; i < m; ++i){
        ans[i] = malloc(sizeof(int) *n);
        (*returnColumnSizes)[i] = n;
    }
    for(int i = 0;i < m; ++i)
        for(int j  = 0; j < n; ++j)
            ans[i][j] = original[i*n + j];
    return ans;
}


相关文章
|
2月前
|
算法
LeetCode刷题---21.合并两个有序链表(双指针)
LeetCode刷题---21.合并两个有序链表(双指针)
|
2月前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
|
2月前
|
存储 算法
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
|
2月前
|
存储 容器
LeetCode刷题---11. 盛最多水的容器(双指针-对撞指针)
LeetCode刷题---11. 盛最多水的容器(双指针-对撞指针)
|
2月前
|
算法
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
|
4月前
|
算法 程序员 索引
【Leetcode 程序员面试金典 02.08】 —— 环路检测 |双指针
我们可以使用双指针解决本题,由数学推导可知:a 的距离为(环长度的倍数 - b),即 tmp 指针从头节点走到环开头节点等于 slow 指针走到环开头节点的距离
|
2月前
|
存储 算法
LeetCode刷题---75. 颜色分类(双指针,循环不变量)
LeetCode刷题---75. 颜色分类(双指针,循环不变量)
|
2月前
|
算法
LeetCode刷题---283. 移动零(双指针)
LeetCode刷题---283. 移动零(双指针)
|
2月前
|
存储 算法
LeetCode刷题--- 61. 旋转链表(快慢指针+闭合为环)
LeetCode刷题--- 61. 旋转链表(快慢指针+闭合为环)
|
2月前
|
算法 索引
LeetCode刷题--- 138. 复制带随机指针的链表(哈希表+迭代)
LeetCode刷题--- 138. 复制带随机指针的链表(哈希表+迭代)