图解力扣中c语言的int *returnSize和int **returnColumnSizes

本文详细解释了在C语言中使用LeetCode模板时`int*returnSize`和`int**returnColumnSizes`参数的作用,指明returnSize表示二维数组的行数,returnColumnSizes表示内层数组的列数。并给出了如何在实际问题中正确赋值这两个参数的方法,指出LeetCode已预先分配了内存空间,避免了重复操作。
摘要由CSDN通过智能技术生成

本人使用纯c刷leetcode时发现c的模板中经常出现int *returnSize和int **returnColumnSizes这两个参数,这实在是加大了c语言写题目的负担。
下面使用leetcode中的测试样例具象化这两个参数的作用,以及在leetcode中该如何赋值。

理解指针

int*p 相信大家都了解,p指针指向一块内存区域。这里用数组的视角和leetcode的测试样例解释

    int arr[]={1,2,3};
    int *p=arr;
    p = [1,2,3]

通俗的理解*p即只有一层方括号。

    int arr[][1] = {{1,2}, {3,4}, {5,6}};
    int **p = arr;
    p = [ 
    [1,2], 
    [3,4], 
    [5,6,7] 
    ];

**p有两层方括号。

简单理解*returnSize

Return an array of arrays of size *returnSize

.这是leetcode的代码模板注解,字面意思就是用returnSize表示数组的大小,对于二维数组来说,returnSize就表示了二维数组的行数即内层方括号的个数,对于上述二维数组的例子,returnSize=3。

简单理解**returnColumnSizes

The sizes of the arrays are returned as *returnColumnSizes array.

数组的大小返回为returnColumnSizes。这里的数组其实是内层的数组,数组的大小其实就是二维数组每行的列数
对于上述数组,returnColumnSizes=[ [2,2,3] ];即第一行有2个元素,第二行有2个元素,第三行有3个元素。

leetcode中的赋值方法

这是题号77的函数

int** combine(int n, int k, int* returnSize, int** returnColumnSizes) 

题目为

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

示例 1:
输入:n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]
示例 2:
输入:n = 1, k = 1
输出:[[1]]

对于returnSize只需要

*returnSize=0,然后按需累加

returnColumnSizes就稍微复杂一点,大多数题解都是直接这样写却没说为什么

*returnColumnSizes=malloc(resNum*sizeof(int));
for(int i=0;i<resNum;i++){
        (*returnColumnSizes)[i]=k;;
}

第一行的malloc开辟了resNum个int大小的内存空间相当于[ [x,x,x] ]
(*returnColumnSizes)相当于returnColumnSizes[0]即取到第一个内层方括号的地址。
等价于

for(int i=0;i<resNum;i++){
        returnColumnSizes[0][i]=k;
}

经过测试发现,leetcode中的这两个参数都是已经开辟过内存空间的了,但是具体是多少我们不知道。所以对于returnColumnSizes不需要malloc一个指针空间,leetcode已经开辟好了一个[ [null] ]空间。我们需要做的只是把内层括号中的空间开辟好。

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
力扣317题的Python解法如下: ```python from collections import deque def shortestDistance(grid): if not grid or not grid[0]: return -1 rows, cols = len(grid), len(grid[0]) buildings = 0 distance = [[0] * cols for _ in range(rows)] reach = [[0] * cols for _ in range(rows)] for i in range(rows): for j in range(cols): if grid[i][j] == 1: buildings += 1 if not bfs(grid, distance, reach, i, j): return -1 min_distance = float('inf') for i in range(rows): for j in range(cols): if grid[i][j] == 0 and reach[i][j] == buildings: min_distance = min(min_distance, distance[i][j]) return min_distance if min_distance != float('inf') else -1 def bfs(grid, distance, reach, row, col): rows, cols = len(grid), len(grid[0]) visited = [[False] * cols for _ in range(rows)] queue = deque([(row, col)]) visited[row][col] = True level = 0 while queue: level += 1 size = len(queue) for _ in range(size): x, y = queue.popleft() neighbors = [(x-1, y), (x+1, y), (x, y-1), (x, y+1)] for nx, ny in neighbors: if 0 <= nx < rows and 0 <= ny < cols and not visited[nx][ny]: visited[nx][ny] = True if grid[nx][ny] == 0: distance[nx][ny] += level reach[nx][ny] += 1 queue.append((nx, ny)) elif grid[nx][ny] == 1: continue else: return False # obstacle return True ``` 这段代码用于解决力扣317题,是一个基于广度优先搜索的解法。它计算了每个空地到所有建筑物的最短距离,并找到距离所有建筑物最近的空地。如果有多个最近的空地,则返回其任意一个的距离。如果不存在这样的空地,则返回-1。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值