สมมติว่าเรามีอาร์เรย์ที่เรียกว่า arr เราต้องลบอาร์เรย์ย่อยของ arr เพื่อให้องค์ประกอบที่เหลืออยู่ใน arr อยู่ในลำดับที่ไม่ลดลง เราต้องหาความยาวของ subarray ที่สั้นที่สุดเพื่อลบออก
ดังนั้น หากอินพุตเป็นเหมือน arr =[10,20,30,100,40,20,30,50] ผลลัพธ์จะเป็น 3 เพราะเราสามารถลบ [100, 40, 20] ซึ่งเป็นอาร์เรย์ย่อยที่เล็กที่สุดของความยาว 3 และโดยการลบสิ่งเหล่านี้ทั้งหมดจะไม่ลดลง [10,20,30,30,50]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:
- n :=ขนาดของ arr
- arr :=ใส่ 0 ที่ด้านซ้ายของ arr และอินฟินิตี้ที่ด้านขวาของ arr
- A,B :=สองรายการที่ว่างเปล่าใหม่
- p :=1, q:=ขนาดของ arr -2
- ม :=0
- ในขณะที่ p <=q ทำ
- ถ้า arr[p-1] <=arr[p] แล้ว
- ใส่ arr[p] ที่ส่วนท้ายของ A
- p :=p + 1
- มิฉะนั้น เมื่อ arr[q] <=arr[q+1] แล้ว
- ใส่ arr[q] ที่ส่วนท้ายของ B
- ในขณะที่ 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