मान लीजिए कि हमारे पास गिरफ्तारी की एक सरणी और एक अन्य मूल्य लक्ष्य है। हमें एआर के दो गैर-अतिव्यापी उप-सरणी ढूंढनी है जहां प्रत्येक के पास लक्ष्य के बराबर योग है। यदि कई उत्तर हैं, तो हमें एक ऐसा उत्तर खोजना होगा जहां दो उप-सरणी की लंबाई का योग सबसे छोटा हो। हमें दो आवश्यक उप-सरणी की लंबाई का न्यूनतम योग खोजना होगा, यदि ऐसा कोई उप-सरणी नहीं है तो -1 लौटाएं।
इसलिए, यदि इनपुट एआर =[5,2,6,3,2,5] लक्ष्य =5 जैसा है, तो आउटपुट 2 होगा, योग 5 के साथ तीन उप-सरणी हैं, वे हैं [5], [3,2 ] और [5], अब उनमें से केवल दो का आकार सबसे छोटा है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
उत्तर:=अनंत
-
सर्वोत्तम:=एक सरणी बनाएं जिसका आकार एआर के समान हो और अनंत से भर जाए
-
उपसर्ग :=0
-
नवीनतम:=एक नक्शा जहां कुंजी 0 के लिए -1 स्टोर करें
-
प्रत्येक अनुक्रमणिका i और arr के मान x के लिए, करें
-
उपसर्ग :=उपसर्ग + x
-
अगर (उपसर्ग - लक्ष्य) नवीनतम में मौजूद है, तो
-
ii:=नवीनतम[उपसर्ग - लक्ष्य]
-
अगर ii>=0, तो
-
Ans :=न्यूनतम उत्तर और (i - ii + best[ii])
-
-
सर्वोत्तम [i] :=i - ii
-
-
अगर मैं शून्य नहीं हूं, तो
-
नवीनतम [उपसर्ग] :=मैं
-
-
-
उत्तर दें यदि उत्तर <999999 अन्यथा -1
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
def solve(arr, target):
ans = 999999
best = [999999]*len(arr)
prefix = 0
latest = {0: -1}
for i, x in enumerate(arr):
prefix += x
if prefix - target in latest:
ii = latest[prefix - target]
if ii >= 0:
ans = min(ans, i - ii + best[ii])
best[i] = i - ii
if i: best[i] = min(best[i-1], best[i])
latest[prefix] = i
return ans if ans < 999999 else -1
arr = [5,2,6,3,2,5]
target = 5
print(solve(arr, target)) इनपुट
[5,2,6,3,2,5], 5
आउटपुट
2