คำอธิบายปัญหา
กำหนดลิสต์ nums หาดัชนีของ "peak" ทุกแห่ง (เรียงน้อยไปมาก) i เป็น peak เมื่อ:
- ตัวเลขถัดไปทางขวาที่ต่างจาก
nums[i]ไม่มี หรือ น้อยกว่าnums[i] - ตัวเลขก่อนหน้าทางซ้ายที่ต่างจาก
nums[i]ไม่มี หรือ น้อยกว่าnums[i] - มีตัวเลขอีกอย่างน้อยหนึ่งตัวทางซ้ายหรือขวาที่ต่างจาก
nums[i]
Plateau (ช่วงค่าเท่ากัน) ถือเป็น peak ร่วมกัน
ตัวอย่าง
nums = [5, 8, 8, 8, 6, 11, 11] → Output: [1, 2, 3, 5, 6]
- วิ่งสแกนลิสต์ จับกลุ่มค่าเท่ากันติดกัน (plateau)
- ตรวจสอบเงื่อนไข peak: ค่ากลุ่ม > ค่าก่อนหน้า (ถ้ามี) และ > ค่าถัดไป (ถ้ามี)
- เพิ่มดัชนีทั้งกลุ่มเข้า
ansหากเป็น peak
ดัชนี 1,2,3 (ค่า 8) เป็น peak | ดัชนี 5,6 (ค่า 11) เป็น peak
ขั้นตอนการแก้ปัญหา
การตนการทำงาน (Python)
def solve(nums):
n = len(nums)
ans = []
i = 0
while i < n:
i0 = i
while i < n and nums[i] == nums[i0]:
i += 1
# ตรวจสอบ peak: ซ้ายต่ำกว่า (หรือไม่มี) และ ขวาต่ำกว่า (หรือไม่มี)
if (i0 == 0 or nums[i0] > nums[i0 - 1]) and (i == n or nums[i0] > nums[i]):
if i0 != 0 or i != n: # ต้องมีข้างเคียงที่ต่างค่า
ans.extend(range(i0, i))
return ans
nums = [5, 8, 8, 8, 6, 11, 11]
print(solve(nums)) # Output: [1, 2, 3, 5, 6]
อินพุต / เอาต์พุต
Input: [5, 8, 8, 8, 6, 11, 11] Output: [1, 2, 3, 5, 6]