leetcode Top100 238. 除自身以外数组的乘积|数组系列

题目链接:238. 除自身以外数组的乘积 - 力扣(LeetCode)

  1. 除自身以外数组的乘积|数组系列

给你一个整数数组 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

解题思路:

题目中给出前缀和后缀的乘积 那该题十有八九就和前缀后缀有关

题意给出的输出24,12,8,6 可以拆分为 1\*2\*3\*4, 1\*3\*4 ,1\*2\*4, 1\*2\*3

再整理一下 2\*3\*4, 1\*3\*4 ,1\*2\*4, 1\*2\*3 可以看出是除去本身数字来实现

所以可以先计算前缀乘积 1, 1\*1, 1\*1\*2, 1\*1\*2\*3 = 1,1,2,6

后缀乘积2\*3\*4,3\*4,4,1 = 24,12,4,1

那么 前后缀乘积相乘就是所求输出 24,12,8,6

Java代码:

java 复制代码
class soul{
    public int[] productExceptSelf(int[] nums){
        if(nums == null || nums.length == 0){//剪枝
            return null;
        }
        int n = nums.length;
        int[] arr1 = new int[n];
        int left = 1;//确定前缀和
        for (int i = 0; i < n; i++) {
            if(i > 0){//防止边界
                left = left * nums[i - 1];//更新前缀和 前缀和 需要 i - 1
            }
            arr1[i] = left;//确定初始值 以及保存后续前缀和值
        }
        int right = 1;
        for (int i = n - 1; i >= 0; i--) { // 写错了i++
            if(i < n - 1){//防止边界介入
                right = right * nums[i + 1];//确定后缀和 后缀和 需要i + 1 
            }
            arr1[i] = arr1[i] * right;//这里其实省去了存储后缀和的步骤 直接相乘得到最终结果
        }
        return arr1;//返回结果
    }
}
相关推荐
旖-旎20 分钟前
《LeetCode 64 最小路径和 || LeetCode 174 地下城游戏》
c++·算法·leetcode·动态规划
森林古猿134 分钟前
再论斜率优化
c++·学习·算法
万法若空43 分钟前
【数学-简单数论】同余中的逆
线性代数·算法
凯瑟琳.奥古斯特2 小时前
力扣1009补码解法C++实现
开发语言·c++·算法·leetcode·职场和发展
KaMeidebaby2 小时前
卡梅德生物技术快报|蛋白的叠氮基修饰:实操解析:核酸模板耦合蛋白的叠氮基修饰实现靶蛋白定点共价标记
前端·人工智能·物联网·算法·百度
通信仿真爱好者3 小时前
第【60期】--大规模MIMO系统信号检测算法误码率比较 --matlab完整代码+参考文章
算法·matlab·mimo·信号检测
AI科技星3 小时前
全域谱分析:无穷维超复数信息场分形统一场论——自然、量子、金融多重分形第一性原理完整体系(中英双语终稿)
人工智能·python·算法·金融·乖乖数学·全域数学
先吃饱再说4 小时前
为什么堆能 O(log n) 插入?拆解完全二叉树的数组魔法
算法·排序算法
留白_5 小时前
【决策树】泰坦尼克号生存预测
算法·决策树·机器学习
hqzing5 小时前
鸿蒙 PC 底层开发技术详解(七):二进制自签名算法的实现
算法·华为·harmonyos