不容错过的经典算法,除自身以外数组的乘积,经典算法实战。

在这里插入图片描述

作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。

多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。

欢迎 点赞✍评论⭐收藏

算法领域知识

链接 专栏
分发糖果 算法专栏
买卖股票的最佳时机 算法专栏
跳跃游戏 算法专栏
H 指数 算法专栏
除自身以外数组的乘积 算法专栏

经典算法题 之 除自身以外数组的乘积

在这里插入图片描述

题目如下:

给你一个整数数组 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(n)时间复杂度内完成,可以使用两个额外的数组left和right来分别保存每个元素i左侧的乘积和右侧的乘积。然后,使用两个循环遍历数组,计算出left[i]和right[i]的值。最后,再遍历一次数组,根据left[i]和right[i]的值计算出answer[i]的结果。

具体实现逻辑如下:

  1. 创建数组left和right,长度与nums相同。
  2. 初始化left[0]为1,并从左到右遍历nums,计算出left[i] = left[i-1] * nums[i-1],其中i从1到n-1(n为nums的长度)。
  3. 初始化right[n-1]为1,并从右到左遍历nums,计算出right[i] = right[i+1] * nums[i+1],其中i从n-2到0。
  4. 创建结果数组answer,长度与nums相同。
  5. 遍历数组nums,根据left[i]和right[i]的值计算出answer[i]的结果为left[i] * right[i]。
  6. 返回结果数组answer。

Java代码实现:

public class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        
        int[] left = new int[n];
        int[] right = new int[n];
        
        left[0] = 1;
        for (int i = 1; i < n; i++) {
            left[i] = left[i-1] * nums[i-1];
        }
        
        right[n-1] = 1;
        for (int i = n-2; i >= 0; i--) {
            right[i] = right[i+1] * nums[i+1];
        }
        
        int[] answer = new int[n];
        for (int i = 0; i < n; i++) {
            answer[i] = left[i] * right[i];
        }
        
        return answer;
    }
    
    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] nums = {1, 2, 3, 4};
        int[] answer = solution.productExceptSelf(nums);
        
        System.out.println("Answer: ");
        for (int i = 0; i < answer.length; i++) {
            System.out.print(answer[i] + " ");
        }
    }
}

执行过程:

以输入数组nums = [1, 2, 3, 4]为例,按照以上算法实现,执行步骤如下:

  1. 初始化数组left = [1, 0, 0, 0]right = [0, 0, 0, 1]answer = [0, 0, 0, 0]
  2. 计算left数组,得到left = [1, 1, 2, 6]
  3. 计算right数组,得到right = [24, 12, 4, 1]
  4. 计算answer数组,得到answer = [24, 12, 8, 6]
  5. 输出结果为Answer: 24 12 8 6

关注作者,普修罗双战士,给你不一样的技术体验,一起在技术领域扶摇直上九万里,共筑坚如磐石的权。

欢迎 点赞✍评论⭐收藏

在这里插入图片描述

你可能感兴趣的:(算法专栏,算法)