【LeetCode热题100】238. 除自身以外数组的乘积(数组)

一.题目要求

给你一个整数数组 nums,返回 数组 answer ,其中 answeri 等于 nums 中除 numsi 之外其余各元素的乘积 。

题目数据 保证 数组 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 <= numsi <= 30
  • 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内

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

四.解题思路

详见代码

五.代码实现

cpp 复制代码
//考虑到不用除法的情况, 可以认为每个位置的ans[i]应当为其左边所有数的乘积乘右边所有数的乘积
//因此我们可以先声明答案数组ans, 遍历一遍求出每个ans[i],表示第i个元素及其后i个元素的乘积
//而后更新nums, 新的nums[i]表示第i个元素及其前i个元素的乘积
//而后在更新一次ans, 此时ans[i] = ans[i + 1] * nums[i - 1] 即可表示该位置的结果(第一个和末尾数特判即可)
class Solution { 
public:
    vector<int> productExceptSelf(vector<int>& nums) {

        vector<int> ans(nums.size(), 0);

        int n = nums.size();

        *ans.rbegin() = *nums.rbegin();

        for (int i = n - 2; i >= 0; i--) {
            ans[i] = nums[i] * ans[i + 1];
        }
        for (int i = 1; i < n; i++) {
            nums[i] = nums[i - 1] * nums[i];
        }

        for (int i = 0; i < n; i++) {
            if (i == 0)
                ans[i] = ans[i + 1];
            else if (i == n - 1)
                ans[i] = nums[i - 1];
            else {
                ans[i] = nums[i - 1] * ans[i + 1];
            }
        }
        return ans;
    }
};

六.题目总结

--

相关推荐
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出多任务下载器中的“独特下载速度“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
Discipline10292 小时前
尼泊尔河流流量:天气驱动的预测与高流量风险
人工智能·算法
XuCoder2 小时前
改一个数,右边全得重算,这题怎么扛住两万次查询
算法
小羊没烦恼!3 小时前
在Scrum中实施敏捷建模
java·开发语言·windows·算法·c#
weixin_307779133 小时前
基于睿擎工业开发平台的预训练视觉模型轻量化适配与低代码部署优化
开发语言·算法
hold?fish:palm3 小时前
45 二叉树的右视图
开发语言·c++·算法
粤鼎恒业4 小时前
惠州工厂电子料回收厂家推荐:从交接单反推筛选标准
大数据·数据库·算法·硬件架构·硬件工程·pcb工艺·材料工程
小爷毛毛(卓寿杰)4 小时前
【Agent 意图识别】输出协议、评估与置信度
人工智能·算法·大模型·prompt·大语言模型·agent
优质酸酸乳4 小时前
力扣100题之21合并两个有序链表
算法·leetcode·链表
旖旎夜光4 小时前
LeetCode 137 : 只出现一次的数字 II(位运算) —— 题解
c++·笔记·学习·算法·leetcode·力控