238. 除自身以外数组的乘积

解法1

假设使用除法

java 复制代码
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int cnt0 = 0, idx0 = 0, lc = 1;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0) {
                cnt0++;
                idx0 = i;
            } else {
                lc *= nums[i];
            }
        }
        int[] ans = new int[nums.length];
        if (cnt0 == 1) {
            ans[idx0] = lc;
        } else if (cnt0 < 1) {
            for (int i = 0; i < ans.length; i++) {
                ans[i] = lc / nums[i];
            }
        }
        return ans;
    }
}

解法2

使用额外数组

从左向右乘法,从右向左乘法

java 复制代码
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        if (n < 2) {
            return nums;
        }
        int[] left = new int[n];
        int[] right = new int[n];
        int[] ans = new int[n];
        int base = 1;
        for (int i = 0; i < n; i++) {
            base *= nums[i];
            left[i] = base;
        }
        base = 1;
        for (int i = n - 1; i > -1; i--) {
            base *= nums[i];
            right[i] = base;
        }
        ans[0] = right[1];
        ans[n - 1] = left[n - 2];
        for (int i = 1; i < n - 1; i++) {
            ans[i] = left[i - 1] * right[i + 1];
        }
        return ans;
    }
}

解法3

常数项额外空间

left或者right可以作为最终数组,节约空间。

right动态计算,可以只用一个变量。

java 复制代码
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        if (n < 2) {
            return nums;
        }
        int[] left = new int[n];
        left[0] = 1;
        for (int i = 1; i < n; i++) {
            left[i] = left[i - 1] * nums[i - 1];
        }
        int r = 1;
        for (int i = n - 2; i > -1; i--) {
            r *= nums[i + 1];
            left[i] *= r;
        }
        return left;
    }
}
相关推荐
闻缺陷则喜何志丹5 分钟前
【贪心 字典序 回文 最长公共前缀】LeetCode3734. 大于目标字符串的最小字典序回文排列|分数未知
c++·算法·力扣·贪心·字典序·回文·最长公共前缀
weixin_5142218524 分钟前
FDTD代码学习-1
学习·算法·lumerical·fdtd
AI柠檬1 小时前
机器学习:数据集的划分
人工智能·算法·机器学习
代码雕刻家1 小时前
1.4.课设实验-数据结构-单链表-文教文化用品品牌2.0
c语言·数据结构
让我们一起加油好吗1 小时前
【数论】裴蜀定理与扩展欧几里得算法 (exgcd)
算法·数论·裴蜀定理·扩展欧几里得算法·逆元
Geo_V2 小时前
提示词工程
人工智能·python·算法·ai
云边有个稻草人2 小时前
Rust 借用分割技巧:安全解构复杂数据结构
数据结构·安全·rust
侯小啾2 小时前
【22】C语言 - 二维数组详解
c语言·数据结构·算法
TL滕2 小时前
从0开始学算法——第一天(如何高效学习算法)
数据结构·笔记·学习·算法
傻童:CPU2 小时前
DFS迷宫问题
算法·深度优先