Valid Triangle Number(511)
阿新 • • 發佈:2018-12-24
511—Valid Triangle Number
Given an array consists of non-negative integers, your task is to count the number of triplets chosen from the array that can make triangles if we take them as side lengths of a triangle.
Example 1:
Input: [2,2,3,4]
Output: 3
Explanation:
Valid combinations are:
2,3,4 (using the first 2)
2,3,4 (using the second 2)
2,2,3
Note:
The length of the given array won’t exceed 1000.
The integers in the given array are in the range of [0, 1000].
C程式碼:
#include <stdlib.h> int comp(const void*a, const void*b){ return *(int*)a - *(int *)b; } int triangleNumber(int* nums, int numsSize) { int ans = 0; qsort(nums,numsSize,
sizeof(int), comp); for(int a = 0; a < numsSize - 2; a++) { for (int b = a+1 ; b< numsSize - 1; b++){ for (int c = b+1; c < numsSize; c++){ if (nums[a] + nums[b] > nums[c]) { ans++; }else{ break; } } } } return ans; }
Complexity Analysis:
Time complexity : O(n^2)
Space complexity : O(logn). 排序的空間
思路:
-
知道如何構成三角形的的規則, 即兩邊之和大於第三邊.
-
如何取出三邊問題, 最簡單的思路暴力列舉, 即三個邊a,b,c分別都遍歷一次陣列.
Complexity Analysis:
Time complexity : O(n^3)
Space complexity : O(1)這種情況下會出現超時的情況
-
解決方法: 把陣列排序, 即只用判斷a+b>c的條件即可, 這種情況下, c 邊可能不用全部遍歷陣列, 出現不滿足a+b>c 的情況即可進入下一輪迴圈(改變b).