大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
这道题目考察的是在给定整数数组中计算其他元素的乘积,要求时间复杂度为 O(n),并且保证乘积结果在 32 位整数范围内。
题目解答方法的文字分析
给定一个整数数组 milk_amount
,表示不同品种的乳牛的产奶量。
我们的任务是返回一个数组 others
,其中 others[i]
表示数组 milk_amount
中除了 milk_amount[i]
之外其他元素的乘积。
为了实现时间复杂度为 O(n) 的算法解决此问题,我们可以使用两个数组来辅助计算其他元素的乘积。
具体步骤如下:
- 初始化两个数组
left
和right
,长度与milk_amount
数组相同,用于存储每个元素左侧和右侧元素的乘积。 - 遍历
milk_amount
数组,计算每个元素左侧所有元素的乘积,存储到left
数组中。具体步骤如下:初始化一个变量 product 为 1,用于存储左侧元素的乘积。从左往右遍历 milk_amount 数组,对于每个元素 milk_amount[i],将 product 乘以 milk_amount[i],然后将结果存入 left[i]。 - 遍历
milk_amount
数组,计算每个元素右侧所有元素的乘积,存储到right
数组中。具体步骤如下:初始化一个变量 product 为 1,用于存储右侧元素的乘积。从右往左遍历 milk_amount 数组,对于每个元素 milk_amount[i],将 product 乘以 milk_amount[i],然后将结果存入 right[i]。 - 遍历
milk_amount
数组,计算其他元素的乘积。对于每个元素milk_amount[i]
,其对应的others[i]
可以通过left[i] * right[i]
得到。 - 返回
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; } };