题目:
此题固定套路是先固定最大的边,然后通过双指针一个从前向后(表示最小边),一个从后向前(表示次大边),如果前面那个指针指向的值和后面那个指针指向的值加起来满足了三角形构成条件,那么最小边可以取两个指针之间的任意值,然后可以令次大的边变小些,看是否满足。如果不满足,说明最小的边太小了,让最小的边变大些,因为是最小边,所以其值不能大于次大边。两个指针相遇时,说明已经遍历完了最大边是当前固定的最大边时的情况,此时令最大边小些,然后最小边和次大边重新开始遍历。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include <algorithm> #include <vector>
using std::vector;
class Solution { public: int triangleNumber(vector<int> &nums) {
if (nums.size() < 3) { return 0; } vector<int> vec(nums); int n; int i, j, k; int res = 0;
std::sort(nums.begin(), nums.end());
n = vec.size(); for (k = n - 1; k >= 2; k--) { i = 0; j = k - 1; while (i < j) { if (nums[i] + nums[j] > nums[k]) { res += (j - i); --j; } else { i++; } } } return res; } };
|