首页 > 其他分享 >LeetCode 566重塑矩阵 指针操作理解笔记

LeetCode 566重塑矩阵 指针操作理解笔记

时间:2022-10-26 12:33:54浏览次数:107  
标签:int ans 矩阵 566 重塑 数组 returnColumnSizes LeetCode 指针

LeetCode 566重塑矩阵 指针操作理解笔记

题目来源: 力扣题库(LeetCode) 566. 重塑矩阵

前言:

本来刚看到题目的时候,我是很开心的,这题不就是把二维数组“排扁”成一维数组,然后再排列成一个新的二维数组嘛!关键就是把一维数组重新映射回二维数组的关系式,这个我熟!(OS:终于有道名副其实的简单题了)但是LeetCode给出的待补充函数里一堆一级二级指针、还要涉及动态内存分配,属实把我整沉默了TAT,再翻翻官方给出的答案,凡是跟指针有关的我貌似是一句都看不懂呐(╯‵□′)╯︵┻━┻

一览题目

  1. 重塑矩阵

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

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

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

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

img

示例 1:
输入:mat = [[1,2],[3,4]], r = 1, c = 4
输出:[[1,2,3,4]]

img

示例 2:
输入:mat = [[1,2],[3,4]], r = 2, c = 4
输出:[[1,2],[3,4]]

提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 100
-1000 <= mat[i][j] <= 1000
1 <= r, c <= 300

一览代码

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** matrixReshape(int** mat, int matSize, int* matColSize, int r, int c, int* returnSize, int** returnColumnSizes){
    int n = matColSize[0];
    int m = matSize;
    if(r * c != m * n)
    {
        *returnColumnSizes = matColSize;
        *returnSize = matSize;
        return mat;
    }

    int **ans = malloc(sizeof(int *) * r);
    *returnColumnSizes = malloc(sizeof(int) * r);
    *returnSize = r;
    for(int i = 0; i < r; i ++)
    {
        (*returnColumnSizes)[i] = c;
        ans[i] = malloc(sizeof(int) * c);
    }
    for(int i = 0; i < m * n; i ++)
    {
        ans[i / c][i % c] = mat[i / n][i % n];
    }
    return ans;
}

对各个参数的理解

对于

int** matrixReshape(int** mat, int matSize, int* matColSize, int r, int c, int* returnSize, int** returnColumnSizes)

其中:
mat为整型的二级指针,是原始矩形(二维数组)
matSize为整型变量,是矩阵的行数
matColSize为整型变量,是矩形的列数
r为整型变量,是重塑矩形的行数
c为整型变量,是重塑矩形的列数
returnSize为整型的一级指针
returnColumnSizes为整型的二级指针,是重塑矩形各行的列数(一维数组)(不是都一样吗?LeetCode莫名奇妙的数据要求???)

对指针操作的理解

通过声明一个二级指针,开辟一个二维数组

//声明二级指针部分
int **ans = malloc(sizeof(int *) * r);
//循环开辟二维数组部分
    for(int i = 0; i < r; i ++)
    {
        (*returnColumnSizes)[i] = c;//这条下面再讲(*^_^*)、
        /*
        开辟出容量为c个int的内存,将其首地址赋给ans[i]
        */
        ans[i] = malloc(sizeof(int) * c);
    }

  二级指针指向一级指针所在的内存,解引用得到一级指针指向的变量所在的内存。
  声明部分中,开辟出rint指针,这r个指针的内存是连续的。那么malloc返回的是在连续内存上的这rint指针的首地址。将其赋给ans后,我们得到了一个一维指针数组,完成了二维数组开辟中的创建!

问题来咯:这时候可以将整型赋值给数组了吗?其实只要将单个整型变量的地址赋给每个一级指针,那么我们就得到一个一维数组

标签:int,ans,矩阵,566,重塑,数组,returnColumnSizes,LeetCode,指针
From: https://www.cnblogs.com/yousa/p/16827898.html

相关文章

  • [Oracle] LeetCode 694 Number of Distinct Islands 标记路线的DFS
    Youaregivenanmxnbinarymatrixgrid.Anislandisagroupof1's(representingland)connected4-directionally(horizontalorvertical.)Youmayassumea......
  • [Oracle] LeetCode 848 Shifting Letters
    YouaregivenastringsoflowercaseEnglishlettersandanintegerarrayshiftsofthesamelength.Calltheshift()ofaletter,thenextletterinthealph......
  • leetcode 287. Find the Duplicate Number 寻找重复数 (中等)
    一、题目大意给定一个包含n+1个整数的数组nums,其数字都在[1,n]范围内(包括1和n),可知至少存在一个重复的整数。假设nums只有一个重复的整数,返回这个重复的......
  • 力扣(LeetCode) - 好友推荐
    一.题目表:Listens这个表没有主键,可能存在重复项表中的每一行表示用户user_id在day这一天收听的歌曲song_id+-------------+---------+|ColumnName|Type......
  • 剑指 Offer 37. 序列化二叉树 - 力扣(LeetCode)
    剑指Offer37.序列化二叉树-力扣(LeetCode)题目大意:将一棵二叉树序列化成字符串,然后通过该字符串可以重新构造出二叉树思路:看到将二叉树转化成字符串,首先想到的......
  • leetcode-228-easy
    SummaryRangesYouaregivenasorteduniqueintegerarraynums.Arange[a,b]isthesetofallintegersfromatob(inclusive).Returnthesmallestsorted......
  • leetcode-205-easy
    somorphicStringsGiventwostringssandt,determineiftheyareisomorphic.Twostringssandtareisomorphicifthecharactersinscanbereplacedtoge......
  • leetcode-258-easy
    AddDigitsGivenanintegernum,repeatedlyaddallitsdigitsuntiltheresulthasonlyonedigit,andreturnit.Example1:Input:num=38Output:2Expla......
  • leetcode-338-easy
    CountingBitsGivenanintegern,returnanarrayansoflengthn+1suchthatforeachi(0<=i<=n),ans[i]isthenumberof1'sinthebinaryrepresentat......
  • leetcode-290-easy
    WordPatternGivenapatternandastrings,findifsfollowsthesamepattern.Herefollowmeansafullmatch,suchthatthereisabijectionbetweenalett......