Leet code 15三數之和 C語言版

2021-08-20 07:16:59 字數 1496 閱讀 8069

題目描述:

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

注意:答案中不可以包含重複的三元組。

例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:

[ [-1, 0, 1],

[-1, -1, 2]

]

題幹分析:

本題對返回值的要求低,限制少,在此基礎上可以有很多種展開思路,基於效能和常用考慮,本次選取快速排序後依次檢驗的方式;//本系列盡可能每道題採用不一樣的方法,在本題中也可採取其他方式排序;

思路分析:

對於只有數字反饋要求的題目我們應該優先考慮先排序後處理,因為排序只會占用我們nlongn的處理時間,但在後續操作中的優勢卻會逐漸增大,甚至於某些題目離開了排序接近於無解;

排序後我們可以清楚地認識到三數之和==0這個條件,意味著在數字不全為0的情況下,至少有乙個負數的存在,固排序後的情況大概率為:

case 1:[-∞,··· (,0,) ···,∞]//0可能存在,也可能不存在;

同樣的a+b+c==0也存在以下三種情況:

case 1:a,b,c,互異;

case 2:a=b=-c/2 ||-a/2=b=c;

case 3:a=b=c=0;

因為上述情況的存在,導致在排序時我們不可以刪除重複項,否則case 2,case 3,就會被忽略掉,嚴格來講我們應該做穩定排序,即使在這裡排序穩定與否並沒有區別,但能做到更好的時候不應該放低要求;

快排後基於排序的情況,我們選定從左端開始,從最大的負值開始判定是否存在三元組,及存在多少組,直至我們的指標指向的第乙個元素大於0,即當前三元組所有數字大於0,跳出迴圈;

這裡可以改進乙個地方,如果nums[i]==nums[i-1],本次迴圈可以直接跳過,因為上一次已經找出所有與此值有關的三元組了,重複值無需返回;

具體**如下:

/**

* return an array of arrays of size *returnsize.

* note: the returned array must be malloced, assume caller calls free().

*/void quicksort(int* nums,int first,int end) //while

} //for

*returnsize=top+1; //top作為計數器,即為需要返回的長度;

return res;

}

leetcode 15 三數之和 c

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

LeetCode 15 三數之和 C

題目 給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例項 給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 三層迴圈遍歷。...

Leetcode 15 三數之和 C

給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 請你找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 可以先將陣列進行排序,...