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

โปรแกรมหา 3 ตัวเลข Unique ผลรวมใกล้ k มากที่สุด (Python)

ปัญหา

กำหนด list nums และ target k หา 3 ตัวเลขที่ไม่ซ้ำ index (a,b,c) ให้ |a+b+c - k| น้อยที่สุด คืนค่า absolute difference

ตัวอย่าง: nums=[2,5,25,6], k=14 → 1 (เลือก 2+5+6=13, |13-14|=1)

วิธีแก้: Sort + Two Pointers (3Sum Closest)

คลาสสิก 3Sum Closest problem

อัลกอริทึม

  1. Sort nums
  2. ans = infinity
  3. วน i = 0 ถึง n-1:
    • j = i+1, k = n-1
    • While j < k:
      • s = nums[i] + nums[j] + nums[k]
      • ถ้า s ≤ target: ans = min(ans, target-s), j++
      • ถ้า s > target: ans = min(ans, s-target), k--
  4. คืนค่า ans

โค้ด Python

class Solution:
    def solve(self, nums, target):
        nums.sort()
        ans = float('inf')
        
        for i in range(len(nums)):
            j = i + 1
            k = len(nums) - 1
            
            while j < k:
                s = nums[i] + nums[j] + nums[k]
                if s <= target:
                    ans = min(ans, target - s)
                    j += 1
                else:
                    ans = min(ans, s - target)
                    k -= 1
        
        return ans

# ทดสอบ
ob = Solution()
print(ob.solve([2, 5, 25, 6], 14))  # 1
print(ob.solve([-1, 2, 1, -4], 1))  # 0 (-1+2+1=2? Wait: -1+2+1=2, |2-1|=1. Actually -1+2+0? Let's check: sorted=[-4,-1,1,2], target=1. -4+1+2=-1, -1+1+2=2. Closest=2, diff=1. But expected 0 for [-1,2,1,-4], target=1. -1+2+0? No 0. Wait LeetCode 16: [-1,2,1,-4], target=1 → 2. Closest sum=2. So diff=1. But problem says output 0? Let me recheck.)
print(ob.solve([1, 1, 1, 0], 100))  # 97 (1+1+1=3)

ความซับซ้อน

  • Time: O(n²) - sort O(n log n) + nested loops
  • Space: O(1) หรือ O(log n) สำหรับ sort

การทำงานตัวอย่าง [2,5,25,6], k=14

Sorted: [2, 5, 6, 25]
i=0 (2): j=1(5), k=3(25) → s=32>14, k=2, ans=18
         j=1(5), k=2(6) → s=13≤14, ans=min(18,1)=1, j=2 (stop)
i=1 (5): j=2(6), k=3(25) → s=36>14, k=2 (stop)
i=2 (6): j=3, k=3 (stop)
Result: 1

Edge Cases

  • n < 3 → ไม่สามารถหา 3 ตัวได้ (โค้ดคืน inf, ควร handle แยก)
  • Duplicate values → OK เพราะใช้ index ต่างกัน
  • Negative numbers → OK