1. 程式人生 > >Valid Triangle Number(511)

Valid Triangle Number(511)

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). 排序的空間

思路:

  1. 知道如何構成三角形的的規則, 即兩邊之和大於第三邊.

  2. 如何取出三邊問題, 最簡單的思路暴力列舉, 即三個邊a,b,c分別都遍歷一次陣列.

    Complexity Analysis:

    Time complexity : O(n^3)
    Space complexity : O(1)

    這種情況下會出現超時的情況

  3. 解決方法: 把陣列排序, 即只用判斷a+b>c的條件即可, 這種情況下, c 邊可能不用全部遍歷陣列, 出現不滿足a+b>c 的情況即可進入下一輪迴圈(改變b).