class Solution {
public:typedeflonglong LL;intmaxSumMinProduct(vector<int>& nums){int mod =1e9+7;int len = nums.size();
vector<LL>vec(len);for(int i =0; i < len; i++) vec[i]= nums[i];for(int i =1; i < len; i++) vec[i]+= vec[i-1];
LL maxSum =0;for(int i =0; i < len; i++){int l = i-1,r = i+1;//向左边查找while(l >=0){if(nums[i]<= nums[l]) l--;elsebreak;}// l == -1 表示,比最左边都小, l == 0 ,表示没有最左边的数小while(r < len){if(nums[i]<= nums[r]) r++;elsebreak;}// l == len 表示,比最右边都小, l == len-1,表示没有最右边的数小
LL sum =0;if(l ==-1) sum = vec[r-1]*(LL)nums[i];else sum =(vec[r-1]- vec[l])*(LL)nums[i];
maxSum =max(maxSum,sum);}return maxSum%mod;}};
单调栈 +前序和
class Solution {
public:typedeflonglong LL;intmaxSumMinProduct(vector<int>& nums){int mod =1e9+7;int len = nums.size();
vector<LL>vec(len);for(int i =0; i < len; i++) vec[i]= nums[i];for(int i =1; i < len; i++) vec[i]+= vec[i-1];
LL maxSum =0;
stack<int> st;for(int i =0; i < len; i++){while(!st.empty()&& nums[st.top()]> nums[i]){int top = st.top(); st.pop();int l;if(!st.empty()) l = st.top();else l =-1;int r = i;//区间和
LL distanceSum =0;if(l ==-1) distanceSum = vec[r-1];else distanceSum = vec[r-1]- vec[l];//区间和*当前最小值
LL nowSum = distanceSum*nums[top];
maxSum =max(maxSum,nowSum);}
st.push(i);}while(!st.empty()){int top = st.top(); st.pop();int l;if(!st.empty()) l = st.top();else l =-1;int r = len;//区间和
LL distanceSum =0;if(l ==-1) distanceSum = vec[r-1];else distanceSum = vec[r-1]- vec[l];//区间和*当前最小值
LL nowSum = distanceSum*(LL)nums[top];
maxSum =max(maxSum,nowSum);}return maxSum % mod;}};
文章目录以最小值为切入点,左右指针分别查找,O(n2)超时以最小值为切入点,左右指针分别查找,O(n2)超时class Solution {public: typedef long long LL; int maxSumMinProduct(vector<int>& nums) { int mod = 1e9+7; int len = nums.size(); vector<LL> vec(len