三數之和(leetcode15)

2022-06-08 08:00:14 字數 2171 閱讀 8077

題目

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

示例 1:

輸入:nums = [-1,0,1,2,-1,-4]

輸出:[[-1,-1,2],[-1,0,1]]

分析:

不重複 的本質是什麼?

我們保持三重迴圈的大框架不變,只需要保證:

第二重迴圈列舉到的元素不小於當前第一重迴圈列舉到的元素;

第三重迴圈列舉到的元素不小於當前第二重迴圈列舉到的元素。

我們可以將陣列中的元素從小到大進行排序,隨後使用普通的三重迴圈就可以滿足上面的要求。

同時,對於每一重迴圈而言,相鄰兩次列舉的元素不能相同,否則也會造成重複

這種方法的時間複雜度仍然為 o(n^3),畢竟我們還是沒有跳出三重迴圈的大框架。

然而它是很容易繼續優化的,可以發現,如果我們固定了前兩重迴圈列舉到的元素 a和 b,

那麼只有唯一的 c滿足 a+b+c=0。當第二重迴圈往後列舉乙個元素 b′ 時,由於 b′>b,

那麼滿足 a+b′+c′=0 的 c'一定有 c′也就是說,我們可以從小到大列舉 b,同時從大到小列舉 c,即第二重迴圈和第三重迴圈實際上是並列的關係。

有了這樣的發現,我們就可以保持第二重迴圈不變,而將第三重迴圈變成乙個從陣列最右端開始向左移動的指標

這個方法就是我們常說的「雙指標」,

當我們需要列舉陣列中的兩個元素時,如果我們發現隨著第乙個元素的遞增,第二個元素是遞減的,那麼就可以使用雙指標的方法,將列舉的時間複雜度從 o(n^2)減少至 o(n)。

注意到我們的偽**中還有第一重迴圈,時間複雜度為 o(n)o(n),因此列舉的總時間複雜度為 o(n^2)

**如下:

class

solution

//c 對應的指標初始指向陣列的最右端

int third = n - 1;

int target = -nums[first];

//列舉 b

for (int second = first + 1; second < n; ++second)

//需要保證 b 的指標在 c 的指標的左側

while (second < third && nums[second] + nums[third] >target)

//如果指標重合,隨著 b 後續的增加

//就不會有滿足 a+b+c=0 並且 b

if (second ==third)

if (nums[second] + nums[third] ==target) }}

return

ans;

}}

下面兩個是自己寫的方式這裡做下記錄

//

優化:雙指標法

public

static list>threesum1(integer nums)

int k=len-1;

int target = -first;

for(int j=i+1;j//

第二層迴圈

int second=nums[j];

if(j>i+1&&second==nums[j-1])

while(jtarget)

if(j==k) break

;

if(second+nums[k]==target)}}

return

list;

}//三重迴圈

//ac過程中超出時間限制

public

static list>threesum(integer nums)

for(int j=i+1;j//

第二層迴圈

int second=nums[j];

if(j>i+1&&second==nums[j-1])

for(int k=j+1;k//

第三層迴圈

int third =nums[k];

if(k>j+1&&third==nums[k-1])

if(first+second+third==0)}}

}return

list;

}

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...

leetcode15 三數之和

給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 先找兩數之和,然後再用un...