69 三角形计数(Triangle Count)
生活随笔
收集整理的這篇文章主要介紹了
69 三角形计数(Triangle Count)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1 題目
- 2 解決方案
- 2.1 思路
- 2.2 時間復雜度
- 2.3 空間復雜度
- 3 源碼
1 題目
題目:三角形計數(Triangle Count)
描述:給定一個整數數組,在該數組中,尋找三個數,分別代表三角形三條邊的長度,問,可以尋找到多少組這樣的三個數來組成三角形?
lintcode題號——382,難度——medium
樣例1:
輸入: [3, 4, 6, 7] 輸出: 3 解釋: 可以組成的是 (3, 4, 6), (3, 6, 7),(4, 6, 7)樣例2:
輸入: [4, 4, 4, 4] 輸出: 4 解釋:任何三個數都可以構成三角形,所以答案為 C(3, 4) = 42 解決方案
2.1 思路
??首先三條邊在滿足a<=b<=c的前提下,只要滿足a+b>c即可構成三角形,這樣我們先對數組進行排序,使得按照位置取出來的三個數能夠滿足a<=b<=c,將c通過循環進行遍歷固定,再在c位置之前的子數組中找到和的值大于c的兩個數即可。
2.2 時間復雜度
??排序的時間復雜度O(n * log n),外層循環的時間復雜度為O(n),在子數組找兩數和大于目標值的數的時間復雜度為O(n),總時間復雜度為O(n^2)。
2.3 空間復雜度
??空間復雜度為O(1)。
3 源碼
細節:
C++版本:
/** * @param S: A list of integers * @return: An integer */ int triangleCount(vector<int> &S) {// write your code hereint result = 0;if (S.empty()){return result;}// 先排序,確保三個數的大小 a<=b<=csort(S.begin(), S.end());// 固定c的位置for (int i = 2; i < S.size(); i++){int target = S.at(i);int temp = twoSumGreater(S, 0, i - 1, target); // 找到子數組中令兩數和大于目標值的結果個數result += temp;}return result; }// left指向a,right指向b,找到令 a+b>c 的結果 int twoSumGreater(vector<int> & S, int left, int right, int target) {int result = 0;while (left < right){if (S.at(left) + S.at(right) <= target){left++;}else if(S.at(left) + S.at(right) > target){result = result + (right - left); // 直接將left左移的所有結果加入right--;}}return result; }總結
以上是生活随笔為你收集整理的69 三角形计数(Triangle Count)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 离职总结(2022-9-5)
- 下一篇: 把svg图片生成到svg_“迷失”:SV