1. 程式人生 > 其它 >leetcode三數之和題目分析

leetcode三數之和題目分析

leetcode三數之和題目

題目:給你一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有和為 0 且不重複的三元組。注意:答案中不可以包含重複的三元組。

題目難點:

  1. 如何去除重複解?

  2. 如何降低時間複雜度?

答案:排序加雙指標

這裡記錄一下我的思考過程。

排序的主要目的是消除重複解,並且為使用雙指標做鋪墊。下面進行具體分析。

  1. 例如題目所給示例[-1 0 1 2 -1 -4],當我們針對第一個-1進行分析之後,就沒必要對第二個-1進行分析了,因為對相同的元素進行分析得到的解必是重複解。而在排序之後,我們很容易完成這個步驟,只要判斷前後兩個元素是否一樣即可,如果一樣就跳過該次迴圈,通過這個方法,我們消除了一部分重複解。

  2. 排序為使用雙指標做了鋪墊。我們可以將三數之和轉換為兩數之和。我們固定當前位置為\(i\)\(i\)位置上的值為\(nums[i]\),那麼我們只要在\(i+1\)\(n\)的位置上尋找兩個數加起來為\(-nums[i]\)即可。我在這裡產生了疑問,為什麼是在\(i+1\)\(n\),而不是整個列表呢?這裡也是為了消除重複解,我們沒必要再對在\(i\)之前的元素進行分析了,這是因為通過前面元素所組成的解必會在固定位置為它時被找到。那麼下面就是如何使用雙指標演算法了。

我們令左指標\(L=i+1\),右指標\(R=n-1\),當\(L<R\)時,執行迴圈:

\(nums[i]+nums[L]+nums[R]==0\)

,執行迴圈,判斷左界和右界是否和下一位置重複,去除重複解。並同時將\(L,R\)移到下一位置,尋找新的解。若和大於\(0\),說明\(nums[R]\)太大,$R $左移;若和小於\(0\),說明\(nums[L]\)太小,\(L\)右移。

這裡還有個坑,是我未AC後根據所給示例發現的,所給的示例為[-2 0 0 2 2],這是演算法中必須判斷左界和右界是否和下一位置重複,去除重複解的由來