题目描述:
对于给定的数组,有n个询问,每个询问给出数组下标范围[i,j],求数组[i,j]范围内所有数的乘积。
思路:
维护两个数组:
- product数组,前i个数的乘积(不包括0),如:[1,0,2] ->[1,1,2]
- num_0数组,前i个数中0的个数,如:[1,0,2] -> [0,1,1]
每次计算结果时,用num_0[j]-num_0[i]的结果判断区间内是否有0,如果差值不为0,则包含0,返回结果0。如果差值为0,则返回product[j] / product[i]
C++代码
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
vector<double> product_between_ij(vector<double>& nums, vector<int>& m, vector<int>& n) {
int nums_length = nums.size();
int result_length = m.size();
vector<double> result(result_length);
vector<double> product;
vector<int> num_0;
product.resize(nums_length + 1, 1);
num_0.resize(nums_length + 1, 0);
for (int i = 0; i < nums_length; ++i) {
if (nums[i] != 0){
product[i + 1] = product[i] * nums[i];
num_0[i + 1] = num_0[i];
}
else{
product[i + 1] = product[i];
num_0[i + 1] = num_0[i] + 1;
}
}
for (int k = 0; k < result_length; ++k){
int i = m[k];
int j = n[k];
int n0 = num_0[j + 1] - num_0[i];
if (n0 == 0) {
result[k] = product[j + 1] / product[i];
}
else{
result[k] = 0;
}
}
return result;
}
};
int main() {
vector<double>nums = { 1, 2, 3, 4, 5, 6 };
vector<int> m = { 0, 1, 3};
vector<int> n = {2, 4, 5};
Solution a;
vector<double> result = a.product_between_ij(nums, m, n);
system("pause");
return 0;
}
Python代码
class Solution:
def product_between_ij(self, nums, m, n):
nums_length = len(nums)
result_length = len(m)
product = [1 for _ in range(nums_length+1)]
num_0 = [0 for _ in range(nums_length+1)]
result = [0 for _ in range(result_length)]
for i in range(nums_length):
if nums[i] != 0:
product[i+1] = product[i] * nums[i]
num_0[i+1] = num_0[i]
else:
product[i+1] = product[i]
num_0[i+1] = num_0[i] + 1
for k in range(result_length):
i = m[k]
j = n[k]
n0 = num_0[j+1] - num_0[i]
if n0 == 0:
result[k] = product[j+1] / product[i]
else:
result[k] = 0
return result
if __name__ == "__main__":
nums = [1, 2, 3, 0, 4, 0, 5, 6]
m = [0, 1, 6]
n = [2, 6, 7]
a = Solution()
result = a.product_between_ij(nums, m, n)