LeetCode 15 題解 三數之和

2021-10-09 03:43:10 字數 3553 閱讀 8252

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

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

示例:

給定陣列 nums =[-

1,0,

1,2,

-1,-

4],滿足要求的三元組集合為:[[

-1,0

,1],

[-1,

-1,2

]]

思路為:

當輸入size < 3 時,直接返回空

當輸入size >=3時,分配記憶體n * ( n-1 ) / 6

假設所有的數相加都等於0n個數,每三個數一組,共有n-2 + n-3 + n-4 + ....+ 1種情況,共n * ( n-1 ) / 2種,但在這種情況下是不可能的。因為題目要求不可重複。

所以,取的值 比(size-1)*(size-2)/2小就可以。

考慮到,當 輸出size 為 3 時,n * ( n-1 ) = 6, 所以被除數最大為 6

所以此處,分配記憶體大小為n * ( n-1 ) / 6

設立三個指標,current, left, right

current 取值範圍為[0, size-2]

left 及 right 的取值範圍為[ current, size-2]left++,right--, 當left >= right時該輪遍歷結束

排除一些錯誤解,由於 current 是最小的,right 是最大的

current >=0時,最終結果肯定 > 0

right <=0時,最終結果肯定 < 0

三個指標移動過程如下圖:

// 排序,從小到大排序, 雙向排序

void

sort_array

(int

*nums,

int numssize)

p++;}

left++

; right--;}

printf

("排序後:");

for(tmp =

0; tmp < numssize; tmp++

)printf

(" %3d "

, nums[tmp]);

printf

("\n");

}/**

* return an array of arrays of size *returnsize.

* the sizes of the arrays are returned as *returncolumnsizes array.

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

*/int**

threesum

(int

* nums,

int numssize,

int* returnsize,

int*

* returncolumnsizes)

// 分配記憶體

returen_array =

(int**

)malloc

(sizeof

(int*)

*(numssize -1)

*(numssize )/6

);// 記錄陣列大小,array[i][j]中的 i

*returncolumnsizes =

(int*)

malloc

(sizeof

(int)*

(numssize -1)

*(numssize )/6

);// 記錄每個元素的大小,array[i][j]中的 j

// 對陣列進行排序

sort_array

(nums, numssize)

;// 思路就是 current,指向開頭,

current = nums;

while

(current < nums + numssize -2&&

*current <=0)

elseif(

*left +

*current +

*right <0)

else

}while(*

(++current)==*

(current-1)

&& current < nums + numssize -1)

;// current 去重

}return returen_array;

}

執行結果如下:

排序前:  -10

12-1

-4 排序後: -4-

1-10

12 第 0 輪 current=-4

, left=-1

, right=2,

--*returensize=

0 第 0 輪 current=-4

, left=-1

, right=2,

--*returensize=

0 第 0 輪 current=-4

, left=

0, right=2,

--*returensize=

0 第 0 輪 current=-4

, left=

1, right=2,

--*returensize=

0 第 1 輪 current=-1

, left=-1

, right=2,

--*returensize=

0 第 1 輪 current=-1

, left=

0, right=1,

--*returensize=

1 第 3 輪 current=

0, left=

1, right=2,

--*returensize=

2 輸出: [[-

原因為列印的log 太多,此時注釋相關重複的printf log 即可。

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