longlongmaximumProduct(vector<int>& nums, int m){ if (m == 1) { // 求出数组中的abs最大值就可以了 longlong ans = 0; for (int num : nums) { ans = max(ans, static_cast<longlong>(1LL * num * num)); } return ans; }
// 维护两个前缀和数组 vector<int> preMax(nums.size(), 0); vector<int> preMin(nums.size(), 0); preMax[0] = nums[0]; preMin[0] = nums[0]; for (int i = 1; i < nums.size(); ++i) { preMax[i] = max(preMax[i - 1], nums[i]); preMin[i] = min(preMin[i - 1], nums[i]); } longlong ans = -INF; // 编译数组,先确认一个右侧边界 for (int i = m-1; i < nums.size(); ++i) { // 最开头的距离为 int left = i - m + 1; // 计算当前的最大值和最小值 longlong c1 = 1LL * preMax[left] * nums[i]; longlong c2 = 1LL * preMin[left] * nums[i]; ans = max(ans, max(c1, c2)); } return ans; } };