leetcode三數之和題目分析
阿新 • • 發佈:2022-03-21
leetcode三數之和題目
題目:給你一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有和為 0 且不重複的三元組。注意:答案中不可以包含重複的三元組。
題目難點:
-
如何去除重複解?
-
如何降低時間複雜度?
答案:排序加雙指標
這裡記錄一下我的思考過程。
排序的主要目的是消除重複解,並且為使用雙指標做鋪墊。下面進行具體分析。
-
例如題目所給示例[-1 0 1 2 -1 -4],當我們針對第一個-1進行分析之後,就沒必要對第二個-1進行分析了,因為對相同的元素進行分析得到的解必是重複解。而在排序之後,我們很容易完成這個步驟,只要判斷前後兩個元素是否一樣即可,如果一樣就跳過該次迴圈,通過這個方法,我們消除了一部分重複解。
-
排序為使用雙指標做了鋪墊。我們可以將三數之和轉換為兩數之和。我們固定當前位置為\(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\)
這裡還有個坑,是我未AC後根據所給示例發現的,所給的示例為[-2 0 0 2 2],這是演算法中必須判斷左界和右界是否和下一位置重複,去除重複解的由來