力扣题目的参数解释(力扣初用者必看指南)

本文详细解读了LeetCode867题中关于矩阵转置的参数,特别是矩阵、行数、列数和返回数组大小的含义,帮助初学者避免常见误解,提高解题效率。
摘要由CSDN通过智能技术生成

导入:

题目来源:leetcode 867 转置矩阵

参数列表:

int** matrix

int matrixSize

int* matrixColSize

int* returnSize

int** returnColumnSizes

模仿main()函数

完整代码

运行结果

最后本题的AC答案

结语:


导入:

相信初次刷力扣的同学经常会因为题目所给的参数看不懂,导致从入门到入土,例如下面这个题目,相信有一些同学已经汗流浃背了。


不过没有关系今天写这个文章就是为了解决这个问题,让大家更好的融入力扣大家庭(上头上头✌)。

首先我先给出我的题目来源,这个变量算比较复杂的,所以也比较有代表性。

题目来源:leetcode 867 转置矩阵

那我们开始咯(yeyeye):

参数列表:

int** matrix

int matrixSize

int* matrixColSize

int* returnSize

int** returnColumnSizes

在刷题的时候题目一定要好好看这种信息也不能放过

翻译如下:

/**

*返回一个大小为*returnSize的数组数组。

*数组的大小以*returnColumnSizes数组的形式返回。

*注意:返回的数组和*columnSizes数组都必须进行mallocated,假设调用者调用free()。

*/


看到这里相信有些朋友就有些想法了吧(没有也没有关系,我会给你将清楚的)

int** matrix

这个就是题目给我们的待转置的数组

int* matrix[2]

int main()
{
	int a[3] = { 1,2,3 };
	int b[3] = { 4,5,6 };
	int* matrix[2] = { a,b };

}

这个比较简单大家也都能理解故我们直接下一个。

int matrixSize

特别注意很多同学(还有我,吐了🤮)可能会因为它的英文而想当然,以为它是整个数组的元素个数,其实它是数组的行数!!!,至于为什么人家就是这么设定的

int* matrixColSize

这个就和它的英文名一样,指的是题目给定数组的列数,不过使用指针来传递的,用的时候记得解引用。

int* returnSize

因为前面有个return所以不难想到,它是要我们返回的(也就是我们求的),后面的Size和前面的matrixSize大同小异,都不是指总元素个数而是行数

int** returnColumnSizes

压轴出场是有道理的,相信许多朋友距离AC都倒在这里了吧(心碎💔),本蒟蒻在这里被恶心了一个晚上,这也就是我为什么要写这篇文章的原因,就是不希望大家在这里浪费时间。

解释如下:我们可以看到它是双重指针,后面有个return和ColumnSizes,不知道大家看到这个会想到什么,我第一时间想到的是,开辟(一定记住返回不论是指针还是双重指针一定要用malloc开创,这也是力扣的一个特点,不用free力扣默认给你free了不用担心)数组图如下

然后每个数组的首个元素存放行数再返回,但是很可惜,这样是错误的❌的,希望大家不要理解成这样。

正确的思想是:

我先给出正确的代码大家先看看(下面有解释)

c就是列的意思,r就是行的意思。

我们可以清楚的看到,returnColumnSizes里面只存储了一个指针(可以理解成数组,这里的功能差不多),那个指针里面放了个个行的列数。

下面我给出模仿题目的main()函数,大家看看(非常细节)

模仿main()函数

解释都在代码里面了,故我就不在多说啦。

int main()
{
    int** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes);
    int matrix0[3] = { 1, 2, 3 };           // 矩阵第1行元素 
    int matrix1[3] = { 4, 5, 6 };          //矩阵第2行元素   
    int* matrix[2] = { matrix0, matrix1 };  // 指针数组, 此处不能直接定义matrix[2][3]作为入参
    int matrixSize = 2;                   //对应行数m      
    int matrixColSize[2] = { 3, 3 };        // 每一行元素个数n 
    int returnSize = 0;                   // 返回矩阵的行数                        
    int* returnColumnSizes = NULL;        // 返回矩阵每一行的列数, 是个数组(指针表示) 
    int** ans = transpose(matrix, matrixSize, matrixColSize, &returnSize, &returnColumnSizes);    // 注意这里要用取地址                            
    // 如果要改变一个变量的值, 就需要传入该变量的指针 
    // ans最终返回为n * m的矩阵 
    for (int i = 0; i < returnSize; i++)
    {
        for (int j = 0; j < matrixSize; j++)
        {
            printf("%d ", ans[i][j]);
        }
        printf("\n");

    }
    return 0;
}

接下来是总代码目标数组我就设为两行三列的数组。

完整代码

数组大家可以自己调整

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdbool.h>
#include <stdio.h>
#include <string.h> 
#include <stdlib.h>
int main()
{
    int** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes);
    int matrix0[3] = { 1, 2, 3 };           // 矩阵第1行元素 
    int matrix1[3] = { 4, 5, 6 };          //矩阵第2行元素   
    int* matrix[2] = { matrix0, matrix1 };  // 指针数组, 此处不能直接定义matrix[2][3]作为入参
    int matrixSize = 2;                   //对应行数m      
    int matrixColSize[2] = { 3, 3 };        // 每一行元素个数n 
    int returnSize = 0;                   // 返回矩阵的行数                        
    int* returnColumnSizes = NULL;        // 返回矩阵每一行的列数, 是个数组(指针表示) 
    int** ans = transpose(matrix, matrixSize, matrixColSize, &returnSize, &returnColumnSizes);    // 注意这里要用取地址                            
    // 如果要改变一个变量的值, 就需要传入该变量的指针 
    // ans最终返回为n * m的矩阵 
    for (int i = 0; i < returnSize; i++)
    {
        for (int j = 0; j < matrixSize; j++)
        {
            printf("%d ", ans[i][j]);
        }
        printf("\n");

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

运行结果

最后本题的AC答案

/**
 * 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** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes) {
    int r = matrixSize;//行m
    int c = *matrixColSize;//列n
    int**transmatrix = (int**)malloc(sizeof(int*)*c);
    *returnColumnSizes = (int*)malloc(sizeof(int)*c);
    for(int i =0;i<c;i++)
    {
        transmatrix[i] = (int*)malloc(sizeof(int)*r);
        (*returnColumnSizes)[i] = r; 
    } 
    for(int i =0;i<r;i++)
    {
        for(int j =0;j<c;j++)
        {
            transmatrix[j][i] = matrix[i][j];
        }
    }
    *returnSize = c;
    return transmatrix;
}

由于本题简单,加上本文重点并不在将解决本题,如果有朋友对本题还有疑惑的话可以去看看官方题解(非常抱歉)

结语:

其实写博客不仅仅是为了教大家,同时这也有利于我巩固自己的知识点,和一个学习的总结,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进,如果大家有所收获的话还请不要吝啬你们的点赞和收藏,这可以激励我写出更加优秀的文章。

  • 50
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问题的关键。需要仔细分析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值