1. 程式人生 > >[LeetCode] 611. Valid Triangle Number

[LeetCode] 611. 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:

  1. The length of the given array won't exceed 1000.
  2. The integers in the given array are in the range of [0, 1000].

題意:從一個數組中找出所有可能構造成三角形的個數

首先我們來思考三角形的定義,兩邊之和大於第三邊即可

那麼,既然考慮到了大小,陣列,我們首先對陣列進行排序。

假設陣列現在是

1  2  3  4  5  6  7  8  9  10

那麼我們去搜陣列可不可以構成三角形,必定得先定一點,去搜剩下兩點。

我們從大到小定點。i 從 9 -> 0

那麼對應元素也就是 10 - 1,為什麼要這樣做,因為最大邊加其他邊一定大於第三邊,我們只需要考慮剩下兩邊之和是否大於最大邊即可

回到這裡,我們採用雙指標搜,由於i的位置已經有了,那麼l = 0, r = i - 1

如果滿足 num[l] + num[r] > num[i] 

那麼之間會有r - l 個數字滿足,比方說 2 + 9 > 10 ,那麼 3到8 + 9都會大於10

O(n*n) 的複雜度

class Solution {
    public int triangleNumber(int[] nums) {
        if (nums.length < 3)
            return 0;

        Arrays.sort(nums);
        int sum = 0;
        for (int
i = nums.length - 1; i >= 2; i--) { int l = 0; int r = i - 1; while (l < r) { if (nums[l] + nums[r] > nums[i]) { sum += r - l; r --; } else { l ++; } } } return sum; } }