【力扣】238. 除自身以外数组的乘积

简介: 【力扣】238. 除自身以外数组的乘积

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]

提示:

  • 2 <= nums.length <= 105
  • -30 <= nums[i] <= 30
  • 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内

进阶:你可以在 O(1) 的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为 额外空间。)

解题方法

  • C
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {

    int left[numsSize], right[numsSize]; // 定义两个数组,表示 nums 左右两边的元素乘积
    int* result = (int*)malloc(sizeof(int) * numsSize); // 定义存储结果的数组
    int i = 0;

    /* 计算 nums[i] 左边元素乘积 */
    left[0] = 1;
    for (i = 1; i < numsSize; i++) {
        left[i] = left[i - 1] * nums[i - 1];
    }

    /* 计算 nums[i] 右边元素乘积 */
    right[numsSize - 1] = 1;
    for (i = numsSize - 2; i >= 0; i--) {
        right[i] = right[i + 1] * nums[i + 1];
    }

    /* 计算除 nums[i] 自身之外的乘积 */
    for (i = 0; i < numsSize; i++) {
        result[i] = left[i] * right[i];
    }
    *returnSize = numsSize;
    return result;
}

复杂度分析

时间复杂度为 O(N),其中 N 指的是数组 nums 的大小。

空间复杂度为 O(N),其中 N 指的是数组 nums 的大小。


相关文章
|
6天前
|
算法
【数组相关面试题】LeetCode试题
【数组相关面试题】LeetCode试题
|
6天前
|
存储
力扣面试经典题之数组/字符串
力扣面试经典题之数组/字符串
27 0
|
6天前
|
人工智能 BI
力扣561 数组拆分
力扣561 数组拆分
|
6天前
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
|
6天前
|
算法
leetcode代码记录(寻找两个正序数组的中位数
leetcode代码记录(寻找两个正序数组的中位数
13 2
|
6天前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
13 0
|
6天前
leetcode代码记录(两个数组的交集
leetcode代码记录(两个数组的交集
9 1
|
6天前
leetcode代码记录(最大子数组和
leetcode代码记录(最大子数组和
12 2
|
6天前
|
存储 算法
Leetcode 30天高效刷数据结构和算法 Day1 两数之和 —— 无序数组
给定一个无序整数数组和目标值,找出数组中和为目标值的两个数的下标。要求不重复且可按任意顺序返回。示例:输入nums = [2,7,11,15], target = 9,输出[0,1]。暴力解法时间复杂度O(n²),优化解法利用哈希表实现,时间复杂度O(n)。
22 0
|
6天前
|
索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引