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

ค่าสูงสุดจากป้ายกำกับ (Largest Values From Labels) ใน Python

โจทย์: มีชุดไอเท็ม แต่ละชิ้นมีค่า values[i] และป้ายกำกับ labels[i] เลือก subset S ที่:

  • ขนาด |S| ≤ num_wanted
  • แต่ละป้ายกำกับ L ใช้ได้สูงสุด use_limit ครั้ง

หาผลรวมค่าสูงสุดที่เป็นไปได้

ตัวอย่าง

values = [5,4,3,2,1], labels = [1,1,2,2,3], num_wanted = 3, use_limit = 1
Output: 9 (เลือกไอเท็มที่ 1, 3, 5 → 5+3+1=9)

อัลกอริทึม: Greedy + Hash Map

  1. จับคู่ (value, label) แล้วเรียงลำดับตาม value มากไปน้อย
  2. เลือกไอเท็มจากค่าสูงสุดลงมา ตรวจสอบข้อจำกัด use_limit ต่อ label
  3. หยุดเมื่อครบ num_wanted หรือหมดไอเท็ม

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

class Solution(object):
    def largestValsFromLabels(self, values, labels, num_wanted, use_limit):
        # จับคู่และเรียงค่ามากไปน้อย
        v = [[values[i], labels[i]] for i in range(len(values))]
        v.sort(key=lambda x: x[0], reverse=True)
        
        ans = 0
        use = {}      # label -> count
        i = 0
        
        while num_wanted > 0 and i < len(v):
            label = v[i][1]
            value = v[i][0]
            
            if label not in use:
                # ใช้ label นี้ครั้งแรก
                num_wanted -= 1
                ans += value
                use[label] = 1
            elif use[label] < use_limit:
                # ใช้ label นี้ยังไม่ครบ limit
                num_wanted -= 1
                ans += value
                use[label] += 1
            
            i += 1
        
        return ans

# ทดสอบ
ob = Solution()
print(ob.largestValsFromLabels([5,4,3,2,1], [1,1,2,2,3], 3, 1))  # Output: 9

ตัวอย่าง Input/Output

Input: [5,4,3,2,1] [1,1,2,2,3] 3 1
Output: 9

ความซับซ้อน: Time O(n log n) จากการเรียงลำดับ, Space O(n)