每日一题(4.20)

目录

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]]

解题思路

  1. 分配空间:根据numRows的值,为二维数组res分配空间,并初始化returnSize为numRows。同时,为returnColumnSizes分配空间,用于存储每一行的列数。

  2. 初始化第一行:杨辉三角的第一行总是只有一个元素1。因此,为res[0]分配一个整数的空间,并赋值为1。同时,设置returnColumnSizes[0]为1。

  3. 生成后续行:从第二行开始,遍历每一行。对于每一行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。

  4. 返回结果:最后,返回二维数组res的指针。

代码实现

c 复制代码
/**
 * 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]

解题思路

  1. 创建一个结果数组 res,并将第一个元素初始化为 1
  2. 从左到右遍历数组,记录左侧元素的乘积
  3. 从右到左遍历数组,记录右侧元素的乘积
  4. 返回结果数组 res

代码实现

c 复制代码
/**
 * 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;
}
相关推荐
君万10 分钟前
【LeetCode每日一题】56. 合并区间
算法·leetcode·golang
墩墩同学10 分钟前
【LeetCode题解】LeetCode 287. 寻找重复数
算法·leetcode·二分查找
小南家的青蛙17 分钟前
LeetCode第55题 - 跳跃游戏
算法·leetcode·职场和发展
啊我不会诶1 小时前
CF每日4题(1500-1700)
c++·学习·算法
shuououo2 小时前
集成算法学习笔记
笔记·学习·算法
呼啸长风2 小时前
漫谈散列函数
算法
NAGNIP2 小时前
彻底搞懂 RoPE:位置编码的新范式
算法
NAGNIP3 小时前
一文搞懂位置编码Positional Encoding
算法
Ghost-Face3 小时前
关于模运算
算法
SunnyKriSmile4 小时前
指针实现数组的逆序存放并输出
c语言·算法·排序算法·数组逆序存放