• LeetCode 238. 除自身以外数组的乘积(java实现)


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

    题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

    不要使用除法,且在 O(n) 时间复杂度内完成此题。

    示例 1:

    输入: nums = [1,2,3,4]
    输出: [24,12,8,6]
    
    • 1
    • 2

    示例 2:

    输入: nums = [-1,1,0,-3,3]
    输出: [0,0,9,0,0]
    
    • 1
    • 2

    提示:

    • 2 <= nums.length <= 10^5
    • -30 <= nums[i] <= 30
    • 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内

    解题思路:

    • 开辟一个等长大小的数组,将除当前下标元素的乘积赋值到新数组的对应下标中
    • 以下代码实现逻辑上没有问题,但有一个示例会超出时间限制
    class Solution {
        public int[] productExceptSelf(int[] nums) {
            int []arr=new int[nums.length];//开辟一个相同大小的数组,用于保存除当前位置其余各元素的乘积
            int k=0;        //用于下标后移
            int dot;        //用于记录各元素的点乘结果
            while(k<nums.length){   //这里while的判断一开始搞错了,当完成新数组所有位置的赋值时候即while循环结束
                dot=1;              //每次进入循环,重新将dot置1,重新记录当前位置的点乘结果
            for(int i=0;i<nums.length;i++){
                if(k==i)continue;       //在for循环中,遇到当前位置的值时,不做任何操作,循环继续
                dot=dot*nums[i];        //除当前位置的元素其余各元素相乘,并将相乘结果用dot接收
                }
                arr[k++]=dot;           //将点乘结果赋值给当前的数组下标,并且下标后移
            }
            return arr;                 //最后返回实现好的数组
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    所以解法二:

    • 开辟两个和原数组长度相等的数组,分别用于记录原数组当前位置左侧元素的乘积和右侧元素的乘积
    • 然后在再开辟一个等长大小answer数组,将左侧元素乘积数组和右侧乘积数组相同下标的元素相乘,然后将结果赋值给answer数组中对应下标的位置
    • 最后返回answer数组
    class Solution {
        public int[] productExceptSelf(int[] nums) {
            int length = nums.length;
    
            // L 和 R 分别表示左右两侧的乘积列表
            int[] L = new int[length];
            int[] R = new int[length];
    
            int[] answer = new int[length];
    
            // L[i] 为索引 i 左侧所有元素的乘积
            // 对于索引为 '0' 的元素,因为左侧没有元素,所以 L[0] = 1
            L[0] = 1;
            for (int i = 1; i < length; i++) {
                L[i] = nums[i - 1] * L[i - 1];
            }
    
            // R[i] 为索引 i 右侧所有元素的乘积
            // 对于索引为 'length-1' 的元素,因为右侧没有元素,所以 R[length-1] = 1
            R[length - 1] = 1;
            for (int i = length - 2; i >= 0; i--) {
                R[i] = nums[i + 1] * R[i + 1];
            }
    
            // 对于索引 i,除 nums[i] 之外其余各元素的乘积就是左侧所有元素的乘积乘以右侧所有元素的乘积
            for (int i = 0; i < length; i++) {
                answer[i] = L[i] * R[i];
            }
    
            return answer;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    SLAM知识点——Eigen旋转量间变换求解、变换矩阵求解
    用DIV+CSS技术设计的个人电影网站(web前端网页制作课作业)
    31、JAVA进阶——XML知识
    图扑软件数字孪生海上风电 | 向海图强,奋楫争先
    工业智能仓储货架|HEGERLS供应电动移动式货架Electric mobile shelf自动立体化仓库货架
    COVID疫苗加强针来袭,是否该接种?
    cocos 之纹理格式和压缩纹理
    RT-Thread 内存管理(学习一)
    半导体制冷片-热电效应简介
    详解SpringBoot的核心特性
  • 原文地址:https://blog.csdn.net/qq_44243059/article/details/125903250