1. 程式人生 > >Leetcode611. 計算陣列中可構成三角形的個數

Leetcode611. 計算陣列中可構成三角形的個數

Leetcode611. 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:
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

解題分析

這道題其實不難,只要你理清了解題的思路。題目的要求很明確,就是讓我們計算陣列中可以構成三角形的數目。我們都知道,要想構成三角形,只需三角形中兩條最短邊之和大於最長邊即可。
基於這樣的原理,我們可以先將陣列從小到大進行排序。將陣列排序後,我們可以這樣想,固定某一個數,然後用左右兩個指標分別指向某個數,當左右指標指向的數字之和大於我們固定的數時,說明此種情況成立。然後將右指標向左移動一位繼續判斷直到不滿足為止,將左指標向右移動一位繼續判斷;直到左指標跟右指標重合。

根據這個思路,我們將陣列從大到小遍歷,將當前遍歷的數nums[i]進行固定,讓左指標指向第0個數nums[0],右指標指向這個數的左邊一個數nums[i-1]。當nums[left]+nums[right]>nums[i]時,把右指標right固定,可以想到:當左指標left往右遍歷時,左指標與右指標之間的和肯定也滿足要求;因此有count+=(right-left)。
將右指標right往左移一位,繼續進行判斷,如果成立,則right繼續重複前面操作;如果不成立,說明兩個數之和太小了,此時將左指標left往右移一位,繼續進行判斷,直到left與right指標重合,這樣就把nums[i]所有的情況都考慮了,最後陣列遍歷完結果就出來了,是不是很簡單呢?

原始碼

class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        int count = 0, size = nums.size();
        sort(nums.begin(), nums.end());
        for (int i = size - 1; i >= 2; i--) {
            int left = 0, right = i - 1;
            while(left < right) {
                if
(nums[left] + nums[right] > nums[i]) { count += (right - left); right--; } else { left++; } } } return count; } };

以上是我對這道問題的一些想法,有問題還請在評論區討論留言~