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;
}
};
以上是我對這道問題的一些想法,有問題還請在評論區討論留言~