Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมหาดัชนีจุดสูงสุด (peaks) ในลิสต์ด้วย Python


คำอธิบายปัญหา

กำหนดลิสต์ nums หาดัชนีของ "peak" ทุกแห่ง (เรียงน้อยไปมาก) i เป็น peak เมื่อ:

  1. ตัวเลขถัดไปทางขวาที่ต่างจาก nums[i] ไม่มี หรือ น้อยกว่า nums[i]
  2. ตัวเลขก่อนหน้าทางซ้ายที่ต่างจาก nums[i] ไม่มี หรือ น้อยกว่า nums[i]
  3. มีตัวเลขอีกอย่างน้อยหนึ่งตัวทางซ้ายหรือขวาที่ต่างจาก nums[i]

Plateau (ช่วงค่าเท่ากัน) ถือเป็น peak ร่วมกัน

ตัวอย่าง

nums = [5, 8, 8, 8, 6, 11, 11] → Output: [1, 2, 3, 5, 6]

    ดัชนี 1,2,3 (ค่า 8) เป็น peak | ดัชนี 5,6 (ค่า 11) เป็น peak

    ขั้นตอนการแก้ปัญหา

    1. วิ่งสแกนลิสต์ จับกลุ่มค่าเท่ากันติดกัน (plateau)
    2. ตรวจสอบเงื่อนไข peak: ค่ากลุ่ม > ค่าก่อนหน้า (ถ้ามี) และ > ค่าถัดไป (ถ้ามี)
    3. เพิ่มดัชนีทั้งกลุ่มเข้า ans หากเป็น 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]