大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

这道题目考察的是在给定整数数组中计算其他元素的乘积,要求时间复杂度为 O(n),并且保证乘积结果在 32 位整数范围内。

题目解答方法的文字分析

给定一个整数数组 milk_amount,表示不同品种的乳牛的产奶量。

我们的任务是返回一个数组 others,其中 others[i] 表示数组 milk_amount 中除了 milk_amount[i] 之外其他元素的乘积。

为了实现时间复杂度为 O(n) 的算法解决此问题,我们可以使用两个数组来辅助计算其他元素的乘积。

具体步骤如下:

  1. 初始化两个数组 leftright,长度与 milk_amount 数组相同,用于存储每个元素左侧和右侧元素的乘积。
  2. 遍历 milk_amount 数组,计算每个元素左侧所有元素的乘积,存储到 left 数组中。具体步骤如下:初始化一个变量 product 为 1,用于存储左侧元素的乘积。从左往右遍历 milk_amount 数组,对于每个元素 milk_amount[i],将 product 乘以 milk_amount[i],然后将结果存入 left[i]。
  3. 遍历 milk_amount 数组,计算每个元素右侧所有元素的乘积,存储到 right 数组中。具体步骤如下:初始化一个变量 product 为 1,用于存储右侧元素的乘积。从右往左遍历 milk_amount 数组,对于每个元素 milk_amount[i],将 product 乘以 milk_amount[i],然后将结果存入 right[i]。
  4. 遍历 milk_amount 数组,计算其他元素的乘积。对于每个元素 milk_amount[i],其对应的 others[i] 可以通过 left[i] * right[i] 得到。
  5. 返回 others 数组。

本题解析所用的编程语言 (C++)

本题解析所用的编程语言是 C++。

完整且正确的编程代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param milk_amount int整型vector 
     * @return int整型vector
     */
    vector<int> product_except_self(vector<int>& milk_amount) {
        int n = milk_amount.size();
        vector<int> left(n, 1);
        vector<int> right(n, 1);

        // 计算每个元素左侧所有元素的乘积
        int product = 1;
        for (int i = 0; i < n; i++) {
            left[i] = product;
            product *= milk_amount[i];
        }

        // 计算每个元素右侧所有元素的乘积
        product = 1;
        for (int i = n - 1; i >= 0; i--) {
            right[i] = product;
            product *= milk_amount[i];
        }

        // 计算其他元素的乘积
        vector<int> others(n);
        for (int i = 0; i < n; i++) {
            others[i] = left[i] * right[i];
        }

        return others;
    }
};

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!