ปัญหา
ให้อาร์เรย์ nums (ค่าไม่ซ้ำ) ตรวจสอบว่ากลับด้าน subarray เพียง 1 ครั้ง ทำให้อาร์เรย์เรียงได้หรือไม่ (ถ้าเรียงอยู่แล้วก็ True)
ตัวอย่าง
nums = [4,6,27,25,15,9,37,42] → กลับ [9,15,25,27] ได้ [4,6,9,15,25,27,37,42] → True
แนวคิดการแก้ปัญหา
- หาจุดที่เริ่มไม่เรียง (i)
- หาจุดที่จบไม่เรียง (j) - ส่วนที่ลดลง
- ตรวจสอบว่ากลับส่วน [i:j] แล้วเชื่อมกับส่วนก่อนและหลังได้เรียงหรือไม่
โค้ดตัวอย่าง
def solve(nums):
n = len(nums)
if n <= 1:
return True
# หาจุดเริ่มลดลง
i = 0
while i < n - 1 and nums[i] < nums[i+1]:
i += 1
if i == n - 1:
return True # เรียงแล้ว
# หาจุดจบลดลง
j = i
while j < n - 1 and nums[j] > nums[j+1]:
j += 1
# ตรวจสอบเงื่อนไขขอบ
if i > 0 and nums[j] < nums[i-1]:
return False
if j < n - 1 and nums[i] > nums[j+1]:
return False
# ตรวจสอบส่วนหลัง j เรียงหรือไม่
for k in range(j, n-1):
if nums[k] > nums[k+1]:
return False
return True
print(solve([4, 6, 27, 25, 15, 9, 37, 42])) # True
อินพุต / เอาต์พุต
Input: [4,6,27,25,15,9,37,42] Output: True