ধরুন আমাদের arr নামক একটি অ্যারে আছে, আমাদেরকে arr-এর একটি subarray অপসারণ করতে হবে যাতে arr-এর অবশিষ্ট উপাদানগুলি হ্রাস না হওয়া ক্রমে থাকে। অপসারণের জন্য আমাদের সবচেয়ে ছোট সাবয়ারের দৈর্ঘ্য খুঁজে বের করতে হবে।
সুতরাং, যদি ইনপুটটি arr =[10,20,30,100,40,20,30,50] এর মত হয়, তাহলে আউটপুট হবে 3 কারণ আমরা [100, 40, 20] মুছে ফেলতে পারি যা 3 দৈর্ঘ্যের সবচেয়ে ছোট সাবয়ারে, এবং এইগুলি অপসারণ করে সবগুলি অ-হ্রাসমান ক্রমে [10,20,30,30,50]৷
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব:
- n :=arr এর আকার
- arr :=arr এর বাম দিকে 0 এবং arr এর ডানে ইনফিনিটি ঢোকান
- A,B :=দুটি নতুন খালি তালিকা
- p :=1, q:=arr-2 এর আকার
- M :=0
- যখন p <=q, do
- যদি arr[p-1] <=arr[p], তাহলে
- A-এর শেষে arr[p] ঢোকান
- p :=p + 1
- অন্যথায় যখন arr[q] <=arr[q+1], তারপর
- বি-এর শেষে arr[q] ঢোকান
- যখন A খালি নয় এবং A এর শেষ উপাদান> B এর শেষ উপাদান, কর
- A থেকে শেষ উপাদান মুছুন
- q :=q - 1
- অন্যথায়,
- লুপ থেকে বেরিয়ে আসুন
- M :=সর্বাধিক M এবং A + সাইজের B সাইজ
- যদি arr[p-1] <=arr[p], তাহলে
- রিটার্ন n - M
আরও ভালভাবে বোঝার জন্য আসুন নিম্নলিখিত বাস্তবায়ন দেখি:
উদাহরণ
def solve(arr):
n = len(arr)
arr = [0] + arr + [float("inf")]
A,B=[],[]
p,q=1,len(arr)-2
M = 0
while p <= q:
if arr[p-1] <= arr[p]:
A.append(arr[p])
p += 1
elif arr[q] <= arr[q+1]:
B.append(arr[q])
while A and A[-1] > B[-1]:
A.pop()
q -= 1
else:
break
M = max(M, len(A)+len(B))
return n - M
arr = [10,20,30,100,40,20,30,50]
print(solve(arr)) ইনপুট
[10,20,30,100,40,20,30,50]
আউটপুট
3