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

ตรวจสอบว่ามี subarray ที่ผลคูณเท่ากับ k หรือไม่ ใน Python


ปัญหา

ให้อาร์เรย์ nums (มีทั้งบวกและลบ) และค่า k ตรวจสอบว่ามี subarray ติดต่อกันที่ผลคูณเท่ากับ k หรือไม่

ตัวอย่าง

nums = [-2, -1, 1, 3, 5, 8], k = 6 → subarray [-2, -1, 3] ผลคูณ = 6 → True

แนวคิดการแก้ปัญหา (Kadane แบบผลคูณ)

เก็บ max_prod และ min_prod จนถึง index ปัจจุบัน (เพราะลบ×ลบ = บวก)

  • เจอตัวลบ → สลับ max/min
  • อัปเดต max/min ด้วย max/min(num, max*num, min*num)
  • ถ้า max หรือ min เท่ากับ k → True

โค้ดตัวอย่าง

def solve(nums, k):
    max_prod = min_prod = nums[0]
    if max_prod == k:
        return True
    for num in nums[1:]:
        if num < 0:
            max_prod, min_prod = min_prod, max_prod
        max_prod = max(num, max_prod * num)
        min_prod = min(num, min_prod * num)
        if max_prod == k or min_prod == k:
            return True
    return False

print(solve([-2, -1, 1, 3, 5, 8], 6))  # True

อินพุต / เอาต์พุต

Input:  [-2,-1,1,3,5,8], 6
Output: True