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

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

1260. 二维网格迁移

1260. 二维网格迁移


题目描述


给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。

每次「迁移」操作将会引发下述活动:


位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。

位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。

位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。

请你返回 k 次迁移操作后最终得到的 二维网格。


思路


按照要求一遍一遍的移动就好了。我觉得更好的方式是变成一维的形势,然后再移动后写回。


int** shiftGrid(int** grid, int gridSize, int* gridColSize, int k, int* returnSize, int** returnColumnSizes){
    //处理返回值
    int m = gridSize, n = *gridColSize,temp[m];
    *returnSize = m;
    *returnColumnSizes = malloc(sizeof(int) * m);
    for(int i = 0; i< m; ++i) (*returnColumnSizes)[i] = n;
    while(k--){
        //执行操作
        for(int i = 0; i < m;++i){
            temp[i] = grid[i][n - 1];
            for(int j = n-1; j > 0; --j)
                grid[i][j] = grid[i][j -1];
        }
        grid[0][0] = temp[m-1];
        for(int i = 1; i < m;++i) grid[i][0] = temp[i-1];
    }
    return grid;
}


661. 图片平滑器

661. 图片平滑器


题目描述


包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。


思路


依次看周围的8个单元是否存在,然后进行计算平均数字就好了。


nt** imageSmoother(int** img, int imgSize, int* imgColSize, int* returnSize, int** returnColumnSizes){
    if(imgSize == 0 || *imgColSize == 0){*returnSize = 0;return NULL;}
    //返回数组空间申请
    int **ans = malloc(sizeof(int *) * imgSize);
    for(int i = 0;i < imgSize;i++)  ans[i] = malloc(sizeof(int) * (*imgColSize));
    (*returnColumnSizes) = malloc(sizeof(int) * imgSize);
    for(int i = 0;i < imgSize;i++)  (*returnColumnSizes)[i] = *imgColSize;
    *returnSize = imgSize;
    //创建二维前缀和
    int temp[imgSize][*imgColSize];
    for(int i = 1;i < imgSize;)
    for(int i = 0;i < imgSize ;i++){
        for(int j = 0;j < *imgColSize;j++){
            int temp = img[i][j],tempnum = 1;
            if(i > 0)   temp += img[i-1][j],tempnum++;
            if(j > 0)   temp += img[i][j-1],tempnum++;
            if(i < imgSize - 1)             temp += img[i+1][j],tempnum++;
            if(j < *imgColSize - 1)  temp += img[i][j+1],tempnum++;
            if(i > 0 && j > 0)  temp+=img[i-1][j-1],tempnum++;
            if(i > 0 && j < *imgColSize-1)   temp += img[i-1][j+1],tempnum++;
            if(i < imgSize - 1 && j > 0) temp+=img[i+1][j-1],tempnum++;
            if(i < imgSize - 1 && j < *imgColSize - 1)  temp+= img[i+1][j+1],tempnum++;
            ans[i][j] = temp/tempnum;
        }
    }
    return ans;
}


1314. 矩阵区域和

1314. 矩阵区域和

题目描述


给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:


i - k <= r <= i + k,

j - k <= c <= j + k 且

(r, c) 在矩阵内。

思路


这个可以使用一个叫做二维前缀和的东东,就是temp[i][j]表示从mat[0][0]到mat[i][j]这样一个矩阵的和。


int getnum(int (*temp)[100],int m,int n,int mmax,int nmax){
    if(m < 0)   m = -1;
    else if(m > mmax -1) m = mmax - 1;
    if(n < 0) n = -1;
    else if ( n > nmax -1) n = nmax -1;
    if(m < 0 || n < 0)  return 0;
    else return temp[m][n];
}
int** matrixBlockSum(int** mat, int matSize, int* matColSize, int k, int* returnSize, int** returnColumnSizes){
    if(matSize == 0 || *matColSize == 0) {*returnSize = 0;return NULL;}
    //创建前缀和数组
    int temp[matSize][100];
    temp[0][0] = mat[0][0];
    for(int i = 1;i < matSize;i++)  temp[i][0] = temp[i - 1][0] + mat[i][0];
    for(int i = 1;i < *matColSize;i++)  temp[0][i] = temp[0][i - 1] + mat[0][i];
    for(int i = 1;i < matSize;i++)  
        for(int j = 1;j < *matColSize;j++)
            temp[i][j] = temp[i-1][j] + temp[i][j-1] - temp[i-1][j-1] + mat[i][j];
    *returnSize = matSize;
    (*returnColumnSizes) = matColSize;
    //更新所有信息
    for(int i = 0;i < matSize;i++)
        for(int j = 0;j < *matColSize ;j++)
            mat[i][j] = getnum(temp,i+k,j+k,matSize,*matColSize) + getnum(temp,i-k-1,j-k-1,matSize,*matColSize) - getnum(temp,i-k-1,j+k,matSize,*matColSize) - getnum(temp,i+k,j-k-1,matSize,*matColSize);
    return mat;
}


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

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


题目描述


给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。

另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。

返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)


思路


我就硬算,就从0到最大遍历添加到结果里。


int** allCellsDistOrder(int rows, int cols, int rCenter, int cCenter, int* returnSize, int** returnColumnSizes){
    int** ans = malloc(sizeof(int*) * 10201),ansnum = 1;
    (*returnColumnSizes) = malloc(sizeof(int)*10201);
    for(int i = 0;i < 10201;i++){
        ans[i] = malloc(sizeof(int)*2);
        (*returnColumnSizes)[i] = 2;
    }
    int temp = 1;
    ans[0][0] = rCenter,ans[0][1] = cCenter;
    while(ansnum < rows * cols){
        for(int i = 0;i < temp;i++){
            int k = temp - i;
            if(rCenter - k >=0 && cCenter - i >= 0){ans[ansnum][0] = rCenter - k;ans[ansnum++][1] = cCenter - i;}
            if(rCenter - i >= 0 && cCenter + k < cols){ans[ansnum][0] = rCenter - i;ans[ansnum++][1] = cCenter + k;}
            //printf("%d %d\n",i,k);
            if(rCenter + k < rows && cCenter + i < cols){ans[ansnum][0] = rCenter + k;ans[ansnum++][1] = cCenter + i;}
            if(rCenter + i < rows && cCenter - k >= 0){ans[ansnum][0] = rCenter + i;ans[ansnum++][1] = cCenter - k;}
        }
        temp++;
        //printf("%d ",ansnum);
    }
    *returnSize = ansnum;
    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. 复制带随机指针的链表(哈希表+迭代)

热门文章

最新文章