↓快轉到主要內容
  1. LeetCode/

LeetCode 2441: Largest Positive Integer That Exists With Its Negative

·1 分鐘· ·
LeetCode Easy Hash-Map Two-Pointers Sorting
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2025-08-06

  • 提交紀錄:Wrong Answer ×4 → Accepted

解題思路
#

找最大的正數 k,而且 -k 也在陣列裡。

把正數和負數的絕對值分開放進兩個 set,兩邊都有的就是符合條件的 k,取最大值。

我的嘗試
#

第一、二版:只用絕對值判斷
#

for num in nums:
    if num < 0:
        num *= -1
    if num not in exist:
        exist.add(num)
    else:
        max_num = max(max_num, num)

把所有數字都轉成絕對值,看到第二次就當作找到一對。問題是同號的重複數字也會被當成一對,例如 [3, 3] 會回傳 3,但 -3 根本不在陣列裡。第二版只是補上「找不到時回傳 -1」,沒有修到這個問題。

第三、四版:分成兩個 set,但正負號寫反
#

改成正數和負數各一個 set,但正負號一直沒處理對:第三版把負數原樣放進 exist_pos、正數放進 exist_neg,一邊全是負數、一邊全是正數,交集永遠是空的;第四版把正數取負號,兩邊都變成負數,交集找得到,但回傳的是負的 -k。最後一版改成「負數取絕對值放進 exist_neg、正數直接放進 exist_pos」才 AC。

正確解法
#

class Solution:
    def findMaxK(self, nums: List[int]) -> int:
        pos = {x for x in nums if x > 0}
        neg = {-x for x in nums if x < 0}
        both = pos & neg
        return max(both) if both else -1

另一種解法:排序後雙指針
#

排序後左指針從最小的負數、右指針從最大的正數開始:絕對值相等就找到答案;左邊的絕對值比較大就左指針往右,否則右指針往左。時間 O(n log n)、空間 O(1)。

複雜度
#

時間 O(n),空間 O(n)。

要特別避免的錯誤
#

  • 只看絕對值:同號的重複數字會被誤判。
  • 兩個 set 的正負號不一致:交集會是空的,或回傳負數。

面試口說整理
#

我把正數放進一個 set、負數取絕對值放進另一個 set,兩個 set 的交集就是同時有正負兩個版本的數字,取最大值;交集是空的就回傳 -1。不能只看絕對值,因為同號的重複數字會被誤判成一對。時間 O(n)。

相關文章

LeetCode 977: Squares of a Sorted Array
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 977 解題筆記:平方後最大的一定在兩端,左右指針比較兩端的平方,大的從結果的最後面往前填
LeetCode 905: Sort Array By Parity
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 905 解題筆記:寫入指標把偶數交換到前面,跟 move zeroes 一樣
LeetCode 922: Sort Array By Parity II
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 922 解題筆記:偶數位置的指標 i、奇數位置的指標 j,各自跳兩格;i 放錯(奇數)時讓 j 找到放錯的偶數再交換
LeetCode 455: Assign Cookies
·1 分鐘
LeetCode Easy Array Two-Pointers Greedy Sorting
LeetCode 455 解題筆記:小孩和餅乾都排序,用最小的、夠大的餅乾滿足最小的小孩;兩個指標各走一次
LeetCode 3606: Coupon Code Validator
·1 分鐘
LeetCode Easy Hash-Table String Sorting
LeetCode 3606 解題筆記:先過濾合法的優惠券,再用(類別順序, code)排序;字元範圍要包含 z、Z、9
LeetCode 3536: Maximum Product of Two Digits
·1 分鐘
LeetCode Easy Math Sorting
LeetCode 3536 解題筆記:找出最大和第二大的位數相乘;找到新的最大值時,舊的最大值要移到第二名