題目的要求有兩個,首先是三個數的和為0,其次是這種和為0的三元組不能重複。
當給定乙個陣列,我們求滿足和為0的三元組的時候核心思想使用的是暴力破解,也就是三重迴圈,遍歷三次陣列,但是在這裡我們給出如下優化:
首先將陣列按照從小到大的順序排序
設定三個指標index,分別為i,j,k,他們分別代表陣列中滿足上述三元組條件的數的位置。
然後使用指標i進行第一次遍歷,找出第乙個數,這層遍歷有如下的限制:
如果當前的數與前乙個數的大小相等,那麼我們可以直接跳過當前的數,因為這個數字已經被處理過了(這就是我們前面排序的好處,可以快速去除重複)
當指定了第乙個數以後,後兩個數的和也就唯一確定了,因為三個數的和為0
然後我們的第二次優化就是將尋找第二個數和第三個數的迴圈合併成乙個迴圈,這就使得演算法的時間複雜度降低了乙個數量級
尋找第二個數是從第乙個數的下一位開始,第三個數是從陣列的末尾開始,直到指向第二個數和第三個數的指標相遇,就退出迴圈(這也是前面對陣列進行排序的好處),因此這一層迴圈的時間複雜度是o(n)。
尋找第二個數和第三個數的另乙個限制就是去除重複數字,和第乙個數字一樣,如果遍歷到的當前數字和上乙個遍歷的數字一樣,那麼這個數字就不做處理。
**如下:
func threesum(nums int) intfor j, k := i+1, len(nums)-1; j < len(nums) && k > j;
if k < len(nums)-1 && nums[k] == nums[k+1]
sum := nums[i] + nums[j] + nums[k]
if sum == 0 else if sum > 0 else
} }return resarr
}
15 三數之和 leetcode
給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。我一拿到這題,就想著暴力破解,三重迴圈,i答案思路 雙指標法,用雙重迴圈,其中一層迴圈雙指標,乙個迴圈兩個變數,時間複雜度就減少了。第一層固定元素k,第二...
LeetCode 15 三數之和
15.給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組 方法一,個人解法正確,但是效率太低,時間複雜度o n 3 時間超時,無法提交至leetcode public s...
leetcode 15 三數之和
給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 class solutio...