**Sum of Subarray Minimums (Leetcode 907)
Learn NSL and NSR for this
Problem Link: https://leetcode.com/problems/sum-of-subarray-minimums/
class Solution:
def sumSubarrayMins(self, nums: List[int]) -> int:
nsl=[]
nsr=[]
n=len(nums)
s=[]
# Find the Nearest smaller to left and
# Nearest smaller to right.
for i in range(n):
if(len(s)==0):
nsl.append(-1)
else:
# Slight variation in below line(<=)
if(nums[s[-1]]<=nums[i]):
nsl.append(s[-1])
else:
# Slight variation in below line(>)
while(len(s)>0 and nums[s[-1]]>nums[i]):
s.pop()
if(len(s)==0):
nsl.append(-1)
else:
nsl.append(s[-1])
s.append(i)
s=[]
for i in range(n-1,-1,-1):
if(len(s)==0):
nsr.append(n)
else:
if(nums[s[-1]]<nums[i]):
nsr.append(s[-1])
else:
while(len(s)>0 and nums[s[-1]]>=nums[i]):
s.pop()
if(len(s)==0):
nsr.append(n)
else:
nsr.append(s[-1])
s.append(i)
nsr=nsr[::-1]
print(nsl)
print(nsr)
ans=0
for i in range(n):
# Now calculate the number of larger elements to left
# and number of larger elements to right for each element.
leftele=i-nsl[i]-1
rightele=nsr[i]-i-1
# print(leftele,rightele)
ans=ans+nums[i]*(leftele+1)*(rightele+1)
return ans%1000000007
Last updated