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

Combination Sum ใน Python - หาผลรวมเป้าหมายจากชุดตัวเลข

สมมติว่าเรามีชุดตัวเลขหล보 (candidate numbers) ที่ไม่ซ้ำกัน และตัวเลขเป้าหมาย (target) เราต้องหาการจัดหมู่ที่ไม่ซ้ำกันทั้งหมดใน candidates ที่ผลรวมเท่ากับ target ตัวเลขเดียวกันสามารถเลือกใช้ได้ไม่จำกัดครั้ง ตัวอย่าง: candidates = [2,3,6,7] และ target = 7 ผลลัพธ์คือ [[7], [2,2,3]]

ขั้นตอนการทำงาน (Recursive Backtracking)

  1. สร้างฟังก์ชัน recursive ชื่อ solve() รับพารามิเตอร์: อาร์เรย์เก็บผลลัพธ์, map สำหรับตรวจสอบซ้ำ, ค่า target, และลิสต์องค์ประกอบที่ไม่ซ้ำกัน
  2. ถ้า target == 0:
    • สร้าง temp จากลิสต์ปัจจุบัน เรียงลำดับ แปลงเป็น tuple
    • ถ้ายังไม่มีใน map ให้เพิ่มลง map และเพิ่มลงผลลัพธ์
    • คืนค่า
  3. ถ้า target < 0 ให้คืนค่า
  4. วนลูป x จาก i ถึงความยาวของลิสต์องค์ประกอบ:
    • เพิ่ม elements[x] ลงในลิสต์ปัจจุบัน
    • เรียก solve(elements, target - elements[x], res, map, i, current)
    • ลบองค์ประกอบสุดท้ายออกจากลิสต์ปัจจุบัน

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

class Solution(object):
    def combinationSum(self, candidates, target):
        result = []
        unique = {}
        candidates = list(set(candidates))
        self.solve(candidates, target, result, unique)
        return result

    def solve(self, candidates, target, result, unique, i=0, current=[]):
        if target == 0:
            temp = [i for i in current]
            temp1 = temp
            temp.sort()
            temp = tuple(temp)
            if temp not in unique:
                unique[temp] = 1
                result.append(temp1)
            return
        if target < 0:
            return
        for x in range(i, len(candidates)):
            current.append(candidates[x])
            self.solve(candidates, target - candidates[x], result, unique, i, current)
            current.pop(len(current)-1)

ob1 = Solution()
print(ob1.combinationSum([2,3,6,7,8], 10))

อินพุต

[2,3,6,7,8] 10

เอาต์พุต

[[2, 8], [2, 2, 2, 2, 2], [2, 2, 3, 3], [2, 2, 6], [3, 7]]