ধরুন আমাদের একটি অ্যারের অ্যারে এবং আরেকটি ভ্যালু টার্গেট আছে। আমাদের arr-এর দুটি নন-ওভারল্যাপিং সাব-অ্যারে খুঁজে বের করতে হবে যেখানে প্রতিটির সমষ্টি লক্ষ্যের সমান। যদি একাধিক উত্তর থাকে, তাহলে আমাদের একটি উত্তর খুঁজতে হবে যেখানে দুটি সাব-অ্যারের দৈর্ঘ্যের যোগফল সবচেয়ে ছোট। আমাদের দুটি প্রয়োজনীয় সাব-অ্যারের দৈর্ঘ্যের ন্যূনতম যোগফল খুঁজে বের করতে হবে, যদি এমন কোন সাব-অ্যারে না থাকে তাহলে -1 ফেরত দিন।
সুতরাং, যদি ইনপুটটি হয় arr =[5,2,6,3,2,5] টার্গেট =5, তাহলে আউটপুট হবে 2 সেখানে যোগফল 5 সহ তিনটি সাবয়ারে রয়েছে, তারা হল [5], [3,2 ] এবং [5], এখন তাদের মধ্যে মাত্র দুটির আকার সবচেয়ে ছোট।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
উত্তর :=অসীম
-
সর্বোত্তম :=একটি অ্যারে তৈরি করুন যার আকার arr এর মতো এবং ইনফিনিটি দিয়ে পূরণ করুন
-
উপসর্গ :=0
-
সর্বশেষ :=একটি মানচিত্র যেখানে সংরক্ষণ করুন -1 কী 0
এর জন্য -
প্রতিটি সূচক i এবং arr এর মান x এর জন্য, do
-
উপসর্গ :=উপসর্গ + x
-
যদি (উপসর্গ - লক্ষ্য) সর্বশেষে উপস্থিত থাকে, তাহলে
-
ii :=সর্বশেষ[উপসর্গ - লক্ষ্য]
-
যদি ii>=0 হয়, তাহলে
-
উত্তর :=সর্বনিম্ন উত্তর এবং (i - ii + সেরা[ii])
-
-
সেরা[i] :=i - ii
-
-
যদি আমি অ-শূন্য হয়, তাহলে
-
সর্বশেষ [উপসর্গ] :=i
-
-
-
উত্তর দিন যদি উত্তর <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