ปัญหา
สมมติว่ามีอาร์เรย์ 2 มิติชื่อ groups และอีกอาร์เรย์หนึ่งชื่อ nums เราต้องตรวจสอบว่าเราสามารถเลือก n ย่อยอาร์เรย์ที่ไม่ทับซ้อนกันจาก nums ได้หรือไม่ โดยที่ย่อยอาร์เรย์ตัวที่ i ต้องเท่ากับ groups[i] (ดัชนีเริ่มจาก 0) และถ้า i > 0 ย่อยอาร์เรย์ตัวที่ (i-1) จะต้องปรากฏก่อนย่อยอาร์เรย์ตัวที่ i ใน nums
ตัวอย่าง
ถ้าอินพุตเป็น groups = [[2,-2,-2],[4,-3,0]] และ nums = [1,-1,0,2,-2,-2,4,-3,0] ผลลัพธ์จะเป็น true เพราะ group[0] อยู่ที่ดัชนี 3 ถึง 5 ของ nums และ group[1] อยู่ที่ดัชนี 6 ถึง 8
ขั้นตอนการแก้ปัญหา
- กำหนด
i := 0 - สำหรับแต่ละ
grpในgroups:- วนลูป
jจากiถึงขนาดของnums- 1:- ถ้าย่อยอาร์เรย์ของ
numsจากดัชนีjถึงj + ขนาดของ grpเท่ากับgrp:- อัปเดต
i := j + ขนาดของ grp - ออกจากลูปใน
- อัปเดต
- มิฉะนั้น คืนค่า
False
- ถ้าย่อยอาร์เรย์ของ
- วนลูป
- คืนค่า
True
การนำไปใช้งาน (Python)
def solve(groups, nums):
i = 0
for grp in groups:
for j in range(i, len(nums)):
if nums[j:j+len(grp)] == grp:
i = j + len(grp)
break
else:
return False
return True
groups = [[2,-2,-2],[4,-3,0]]
nums = [1,-1,0,2,-2,-2,4,-3,0]
print(solve(groups, nums))
อินพุต
[[2,-2,-2],[4,-3,0]], [1,-1,0,2,-2,-2,4,-3,0]
เอาต์พุต
True