โจทย์: กำหนดรายการตัวเลข nums และค่า diff หาความยาวของลำดับเลขคณิต (Arithmetic Subsequence) ที่ยาวที่สุดซึ่งความต่างระหว่างสมาชิกติดกันเท่ากับ diff
ตัวอย่าง
Input: nums = [-1, 1, 4, 7, 2, 10], diff = 3
Output: 4
เหตุผล: ลำดับ [1, 4, 7, 10] ความต่าง = 3 ความยาว = 4
อัลกอริทึม: Dynamic Programming + Hash Map
ใช้ dp[x] = ความยาวลำดับเลขคณิตที่ลงท้ายด้วยค่า x และมีความต่าง diff
ขั้นตอนการทำงาน
- สร้าง
seenเป็น defaultdict(int) ค่าเริ่มต้น 0 - วนลูปแต่ละ
xในnums:- หาก
x - diffอยู่ในseen:seen[x] = seen[x - diff] + 1 - มิฉะนั้น:
seen[x] = 1(เริ่มลำดับใหม่) - อัปเดตคำตอบสูงสุด
mx = max(mx, seen[x])
- หาก
โค้ด Python
from collections import defaultdict
def solve(nums, diff):
seen = defaultdict(int)
mx = 0
for x in nums:
if x - diff in seen:
seen[x] = seen[x - diff] + 1
else:
seen[x] = 1
mx = max(mx, seen[x])
return mx
# ทดสอบ
nums = [-1, 1, 4, 7, 2, 10]
diff = 3
print(solve(nums, diff)) # Output: 4
การทำงานทีละขั้นตอน (Trace)
| x | x-diff | seen[x-diff] | seen[x] | mx |
|---|---|---|---|---|
| -1 | -4 | 0 | 1 | 1 |
| 1 | -2 | 0 | 1 | 1 |
| 4 | 1 | 1 | 2 | 2 |
| 7 | 4 | 2 | 3 | 3 |
| 2 | -1 | 1 | 2 | 3 |
| 10 | 7 | 3 | 4 | 4 |
ความซับซ้อน
- Time Complexity: O(n) - ผ่านอาร์เรย์ 1 รอบ
- Space Complexity: O(n) - Hash Map เก็บค่าที่เจอ
ข้อสังเกต
- เป็น Subsequence (ไม่ต้องติดกันในอาร์เรย์เดิม) แต่ต้องเก็บลำดับเดิม
- ใช้ defaultdict เพื่อให้ค่าเริ่มต้นเป็น 0 อัตโนมัติ
- ทำงานได้กับ diff เป็นลบด้วย (ลำดับลดลง)
การทดสอบเพิ่มเติม
print(solve([1, 2, 3, 4], 1)) # 4
print(solve([1, 3, 5, 7], 2)) # 4
print(solve([5, 3, 1, -1], -2)) # 4 (diff ลบ)
print(solve([1, 5, 9, 13], 4)) # 4
print(solve([1, 2, 4, 8], 1)) # 2 (แค่ 1,2)