基于Hadoop的台风灾情分析可视化平台设计与实践
2026/10/10 5:58:09
🔥个人主页:Milestone-里程碑
❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>
<<Git>><<MySQL>>
🌟心向往之行必能至
这道题的核心是在不使用除法、且时间复杂度为O(n)的前提下,计算数组中每个元素除自身外所有元素的乘积。
直接暴力计算每个位置的乘积会导致O(n²)的时间复杂度,无法满足题目要求。我们可以利用前缀和后缀乘积的思路来高效解决这个问题。
前缀乘积数组v1
v1[i]表示nums[0]到nums[i-1]的乘积v1[0] = 1(没有前缀元素),v1[1] = nums[0],v1[2] = nums[0] * nums[1]后缀乘积数组v2
v2[i]表示nums[i+1]到nums[n-1]的乘积v2[n-1] = 1(没有后缀元素),v2[n-2] = nums[n-1]结果计算
i,除自身外的乘积就是v1[i] * v2[i]cpp
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int n = nums.size(); vector<int> v1(n, 1); vector<int> v2(n, 1); // 计算前缀乘积 for (int i = 1; i < n; ++i) { v1[i] = v1[i-1] * nums[i-1]; } // 计算后缀乘积 for (int i = n-2; i >= 0; --i) { v2[i] = v2[i+1] * nums[i+1]; } // 计算结果 vector<int> ret(n); for (int i = 0; i < n; ++i) { ret[i] = v1[i] * v2[i]; } return ret; } };我们可以把结果数组先作为前缀乘积数组,然后用一个变量动态维护后缀乘积,从而去掉v2数组,将空间复杂度降为 O (1)。
cpp
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int n = nums.size(); vector<int> ret(n, 1); // 前缀乘积存入结果数组 for (int i = 1; i < n; ++i) { ret[i] = ret[i-1] * nums[i-1]; } // 动态维护后缀乘积并更新结果 int suffix = 1; for (int i = n-1; i >= 0; --i) { ret[i] *= suffix; suffix *= nums[i]; } return ret; } };