Advertisement
nikunjsoni

1856

May 9th, 2021
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.33 KB | None | 0 0
  1. class Solution {
  2. public:
  3.     int maxSumMinProduct(vector<int>& nums) {
  4.         // Find prefix sum.
  5.         long long prefixSum[nums.size()+1];
  6.         prefixSum[0] = nums[0];
  7.         for(int i=1; i<nums.size(); i++){
  8.             prefixSum[i] = prefixSum[i-1] + nums[i];
  9.         }
  10.        
  11.         // Find left and right index for each element whose num value is less than element's value.
  12.         vector<int> left(nums.size()), right(nums.size());
  13.         left[0] = -1;
  14.         for(int i=1; i<nums.size(); i++){
  15.             int p = i-1;
  16.             while(p >= 0 && nums[p] >= nums[i])
  17.                 p = left[p];
  18.             left[i] = p;
  19.         }
  20.         int n = nums.size();
  21.         right[n-1] = n;
  22.         for(int i=n-1; i>=0; i--){
  23.             int p = i+1;
  24.             while(p < n && nums[p] >= nums[i])
  25.                 p = right[p];
  26.             right[i] = p;
  27.         }
  28.        
  29.         // For each index, compute answer from left and right index.
  30.         long long ans =  0;
  31.         for(int i=0; i<n; i++){
  32.             long long int rsum = (right[i] == n) ? prefixSum[n-1] : prefixSum[max(0, right[i]-1)];
  33.             long long int lsum = (left[i] == -1) ? 0 : prefixSum[left[i]];
  34.             long long int sum  = rsum-lsum;
  35.             ans = max(ans, nums[i]*sum);
  36.         }
  37.         return ans%(int(1e9+7));
  38.     }
  39. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement