題目
給你乙個包含 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)
**如下:
classsolution
//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...