मान लीजिए कि हमारे पास एक सरणी संख्या है, हमें प्रत्येक गैर-खाली उप-अंकों के अधिकतम न्यूनतम-उत्पाद को खोजना होगा। चूंकि उत्तर काफी बड़ा हो सकता है, इसे मॉड्यूलो 10^9+7 में लौटाएं। सरणी का न्यूनतम-उत्पाद सरणी के योग से गुणा किए गए सरणी में न्यूनतम मान के बराबर है। तो अगर हमारे पास एक सरणी है जैसे [4,3,6] (न्यूनतम मान 3 है) 3*(4+3+6) =3*13 =39 का एक न्यूनतम-उत्पाद है।
इसलिए, यदि इनपुट संख्या =[2,3,4,3] की तरह है, तो आउटपुट 30 होगा क्योंकि हम परिणाम को अधिकतम करने के लिए उपसरणी [3,4,3] प्राप्त कर सकते हैं, इसलिए 3*(3+4+ 3) =3*10 =30.
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
मी :=10^9+7
-
स्टैक :=एक नया स्टैक
-
rsum :=0, Res :=0
-
अंकों के अंत में 0 डालें
-
प्रत्येक अनुक्रमणिका के लिए i और मान v अंकों में, करें
-
जबकि स्टैक खाली नहीं है और अंक [स्टैक के शीर्ष का सूचकांक]>=v, करते हैं
-
index, val) :=स्टैक के ऊपर और इसे स्टैक से पॉप करें
-
arrSum:=rsum
-
यदि स्टैक खाली नहीं है, तो
-
arrSum:=rsum - स्टैक के शीर्ष का मान
-
-
res:=अधिकतम रेस और (nums[index]*arrSum)
-
-
rsum :=rsum + v
-
स्टैक के अंत में पुश (i, rsum) करें
-
-
रिटर्न रेस मॉड एम
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
def solve(nums): m = int(1e9+7) stack = [] rsum = 0 res = 0 nums.append(0) for i, v in enumerate(nums): while stack and nums[stack[-1][0]] >= v: index, _ = stack.pop() arrSum=rsum if stack: arrSum=rsum-stack[-1][1] res=max(res, nums[index]*arrSum) rsum += v stack.append((i, rsum)) return res % m nums = [2,3,4,3] print(solve(nums))
इनपुट
[2,3,4,3]
आउटपुट
30