每日一题(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;
}
相关推荐
W23035765731 天前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
2401_892070981 天前
链栈(链式栈) 超详细实现(C 语言 + 逐行精讲)
c语言·数据结构·链栈
minji...1 天前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
语戚1 天前
力扣 968. 监控二叉树 —— 贪心 & 树形 DP 双解法递归 + 非递归全解(Java 实现)
java·算法·leetcode·贪心算法·动态规划·力扣·
skywalker_111 天前
力扣hot100-7(接雨水),8(无重复字符的最长子串)
算法·leetcode·职场和发展
bIo7lyA8v1 天前
算法稳定性分析中的输入扰动建模的技术9
算法
CoderCodingNo1 天前
【GESP】C++三级真题 luogu-B4499, [GESP202603 三级] 二进制回文串
数据结构·c++·算法
sinat_286945191 天前
AI Coding 时代的 TDD:从理念到工程落地
人工智能·深度学习·算法·tdd
炽烈小老头1 天前
【 每天学习一点算法 2026/04/12】x 的平方根
学习·算法