解題說明
Max Number of K-Sum Pairs
題目描述:給定整數陣列 nums 和整數 k,每次操作可以選出兩個加總為 k 的元素並從陣列移除。回傳可以執行的最大操作次數。
解題思路:有兩種等效做法。排序 + 雙指標:先排序,用 left 和 right 指標從兩端向中間夾擊。若兩數之和等於 k,計數加一並雙雙移動指標;若和小於 k,左指標右移;若大於 k,右指標左移。雜湊表:遍歷陣列,對每個數 x 查表是否有互補數 k-x 可配對;有則消耗一個並計數,否則將 x 記入表中。
C++ 解法
複雜度分析
時間複雜度:O(n log n) — 排序主導;雙指標掃描為 O(n)。
空間複雜度:O(1) 額外空間(排序若為原地;不計輸入)。若改用雜湊表方法則為 O(n)。
虛擬碼
1. Sort nums 2. Set left = 0, right = n-1, ops = 0 3. While left < right: a. sum = nums[left] + nums[right] b. If sum == k: ops++, left++, right-- c. If sum < k: left++ d. If sum > k: right-- 4. Return ops
其他解法
雜湊表 O(n):維護 unordered_map<int,int> freq。對每個 nums[i]:若 freq[k - nums[i]] > 0,配對成功,ops++,freq[k - nums[i]]--;否則 freq[nums[i]]++。時間 O(n)、空間 O(n),適合不允許排序或需保留原陣列的場景。
暴力配對 O(n²):對每個元素線性搜尋互補數並標記已使用。僅適合小輸入,不推薦。
延伸思考
- 若允許同一個元素被多次使用(但每次操作仍需兩個不同位置的元素),答案會如何變化?
- 若改成三個數之和等於 k,最大操作次數應如何計算?
- 雜湊表方法與排序雙指標方法在什麼情況下各有優勢?請從時間與空間複雜度兩個角度分析。