目录
- Leecode-118-杨辉三角
- 题目
- 示例
- 解题思路
- 代码实现
- Leecode-238-除自身以外数组的乘积
- 题目
- 示例
- 解题思路
- 代码实现
Leecode-118-杨辉三角
题目
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例
示例1
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例2
输入: numRows = 1
输出: [[1]]
解题思路
-
分配空间:根据numRows的值,为二维数组res分配空间,并初始化returnSize为numRows。同时,为returnColumnSizes分配空间,用于存储每一行的列数。
-
初始化第一行:杨辉三角的第一行总是只有一个元素1。因此,为res[0]分配一个整数的空间,并赋值为1。同时,设置returnColumnSizes[0]为1。
-
生成后续行:从第二行开始,遍历每一行。对于每一行i(从1开始),首先获取前一行i-1的数组m。然后,为新行i分配i+1个整数的空间,并初始化第一个和最后一个元素为1。接下来,通过遍历前一行m的元素,计算新行n的中间元素,每个元素n[j]都是m[j-1]和m[j]的和。最后,将新行n的指针赋给res[i],并更新returnColumnSizes[i]为i+1。
-
返回结果:最后,返回二维数组res的指针。
代码实现
/*** 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** generate(int numRows, int* returnSize, int** returnColumnSizes) {int** res = (int**) malloc(sizeof(int*) * numRows);*returnSize = numRows;*returnColumnSizes = (int*) malloc(sizeof(int) * numRows);res[0] = (int*) malloc(sizeof(int) * 1);(*returnColumnSizes)[0] = 1;res[0][0] = 1;for (int i = 1; i < numRows; i++) {int* m = res[i - 1];int* n = (int*) malloc(sizeof(int) * (i + 1));(*returnColumnSizes)[i] = i + 1;n[0] = 1;for (int j = 1; j < i; j++) {n[j] = m[j - 1] + m[j];}n[i] = 1;res[i] = n;}return res;
}
Leecode-238-除自身以外数组的乘积
题目
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n) 时间复杂度内完成此题。
示例
示例1
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
示例2
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]
解题思路
- 创建一个结果数组 res,并将第一个元素初始化为 1
- 从左到右遍历数组,记录左侧元素的乘积
- 从右到左遍历数组,记录右侧元素的乘积
- 返回结果数组 res
代码实现
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {int *res = (int *)malloc(sizeof(int)* numsSize);*returnSize = numsSize;res[0] = 1;for(int i = 1; i < numsSize; i++){res[i] = res[i - 1] * nums[i - 1];}int flag = 1;for(int i = numsSize - 1; i >= 0; i--){res[i] *= flag;flag *= nums[i];}return res;
}