給定一個包含非負整數的數組,你的任務是統計其中能夠組成三角形三條邊的三元組個數。數組
輸入: [2,2,3,4]
輸出: 3
解釋:
有效的組合是:
2,3,4 (使用第一個 2)
2,3,4 (使用第二個 2)
2,2,3spa
數組長度不超過1000。code
數組裏整數的範圍爲 [0, 1000]。blog
三條邊要能構成三角形,必然知足兩邊以後大於第三邊。也就是三條邊長度分別是a,b,c,知足a+b>c的均可以組成三角形。這和前面的求小於K的兩數以後的原理是同樣的。排序
1 對數組進行排序,這個時候從右邊選定c,也就是最長的一條邊。class
2 而後對c以前的數組求兩數之和。大於c的則知足條件。原理
代碼以下:統計
int triangleCount(int a[], int len) { int left, right, anchor; int count = 0; insert_sort(a, len); for (int i = len - 1; i >= 2; i--) { //left從左邊開始,right從i以前的最右邊開始 left = 0; right = i - 1; while (left < right) { if (a[left] + a[right] > a[i]) { //若是知足條件,則表示從left到right之間的數字和right相加都知足大於c的條件。由於數組是遞增的 count += right-left; right--; } else { //不知足條件,則left+1 向前繼續尋找 left += 1; } } } return count; }