[Java][Leetcode middle] 238. 除自身以外数组的乘积

第一个想法是:

想求出所有元素乘积,然后除以i对应的元素本书;这个想法是完全错误的:

  1. nums[I] 可能有0
  2. 题目要求了不能用除法

第二个想法是:

其实写之前就知道会超时,但是我什么都做不到啊!

双重循环,O(n2)

第三个做法: 借助辅助数组,官方题解

借助辅助数组:使用L[i],R[i],分别记录i左边和右边元素的乘积

那么res[I],就是L[I]*R[i]

java 复制代码
public int[] productExceptSelf2(int[] nums) {
        int len = nums.length;
        int[] result = new int[len];

        int[] R = new int[len]; //  the right of i: multiply
        int[] L = new int[len]; // the left of i: multiply

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

        for (int i = 0; i < len; i++) {
            result[i] = L[i] * R[i];
        }
        return result;
    }
}

做法四:先用result[]代替上文的L[]

java 复制代码
    public int[] productExceptSelf3(int[] nums) {
        int len = nums.length;
        int[] result = new int[len];

        result[0] = 1;
        for (int i = 1; i < len; i++) {
            result[i] = result[i - 1] * nums[i - 1];
        }

        int R = 1;
        for(int i = len-1 ; i >= 0 ; i--) {
            result[i] = R * result[i];

            R *= nums[i];
        }

        return result;
    }
相关推荐
YuTaoShao1 小时前
【LeetCode 热题 100】139. 单词拆分——(解法一)记忆化搜索
java·算法·leetcode·职场和发展
圣保罗的大教堂2 小时前
leetcode 1277. 统计全为 1 的正方形子矩阵 中等
leetcode
Best_Liu~2 小时前
策略模式 vs 适配器模式
java·spring boot·适配器模式·策略模式
direction__2 小时前
Java Main无法初始化主类的原因与解决方法(VsCode工具)
java·vscode
帧栈2 小时前
开发避坑指南(29):微信昵称特殊字符存储异常修复方案
java·mysql
每天的每一天2 小时前
面试可能问到的问题思考-Redis
java
青云交3 小时前
Java 大视界 -- Java 大数据在智能安防人脸识别系统中的活体检测与防伪技术应用
java·大数据·生成对抗网络·人脸识别·智能安防·防伪技术·活体测试
学习至死qaq3 小时前
信创产品TongLinkQ安装及springboot2整合使用
java·东方通·tonglinkq
我崽不熬夜3 小时前
Java中基本的输入输出(I/O)操作:你知道如何处理文件吗?
java·后端·java ee
我崽不熬夜3 小时前
Java的异常处理机制:如何优雅地捕获和抛出异常?
java·后端·java ee