leetcode-238. 除自身以外数组的乘积-前n项的思想

给你一个整数数组 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) 的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为额外空间。)

cpp 复制代码
class Solution {
public:
    /**
     * 计算除自身以外的数字乘积
     * @param nums 一个整数数组
     * @return 返回修改后的数组,其中每个元素是除自身以外所有元素的乘积
     */
    vector<int> productExceptSelf(vector<int>& nums) {
        // 获取数组的长度
        int len = nums.size();
        
        // 定义两个数组,sun用于存储从左到右的累积乘积,res用于存储从右到左的累积乘积
        // 由于C++没有提供像Python那样的动态数组,因此需要预先定义足够大的数组
        int sun[len+10];
        int res[len+10];
        
        // 初始化累积乘积的边界条件
        sun[0] = 1;
        res[len+1] = 1;
        
        // 从左到右计算累积乘积
        for(int i = 0; i < len; i++) {
            sun[i+1] = nums[i] * sun[i];
        }
        
        // 从右到左计算累积乘积
        for(int i = len-1; i >= 0; i--) {
            res[i+1] = nums[i] * res[i+2];
        }
      
        // 将两个方向的累积乘积结合起来,得到除自身以外的乘积
        for(int i = 0; i < len; i++) {
            if(i == 0) {
                nums[i] = res[2];
            } else if(i == len - 1) {
                nums[i] = sun[len-1];
            } else {
                nums[i] = sun[i] * res[i+2];
            }
        }
        
        // 返回计算后的数组
        return nums;
    }
};
       
相关推荐
_Itachi__26 分钟前
LeetCode 热题 100 101. 对称二叉树
算法·leetcode·职场和发展
少了一只鹅38 分钟前
深入理解指针(5)
java·c语言·数据结构·算法
朱剑君1 小时前
第三天——贪心算法——区间问题
算法·贪心算法
阳洞洞1 小时前
leetcode 15. 三数之和
leetcode·双指针
Mi Manchi262 小时前
力扣热题100之合并两个有序链表
算法·leetcode·链表
阿沁QWQ2 小时前
C语言中的文本读写和二进制读写接口
开发语言·c++·算法
仙人掌_lz2 小时前
深入理解深度Q网络DQN:基于python从零实现
python·算法·强化学习·dqn·rl
小雅痞3 小时前
[Java][Leetcode middle] 80. 删除有序数组中的重复项 II
java·python·leetcode
TsingtaoAI3 小时前
企业内训|智能调控系统算法与优化——某汽车厂商
算法·汽车·ai企业内训·自动驾驶企业内训·智驾企业培训
安特尼3 小时前
招行数字金融挑战赛数据分析赛带赛题二
python·算法·机器学习·金融·数据分析