class Solution {
public:
int triangleNumber(vector<int>& nums) {
//排序数组
sort(nums.begin(), nums.end());
//删除零元素
while (1) {
//若数组中边长个数少于3,则直接返回0
if (nums.size () < 3) {
return 0;
} else {
if (nums[0] == 0) {
nums.erase(nums.begin());
} else {
break;
}
}
}
int cnt = 0;
//用于数组中保存小于等于x的元素的个数
//res[100]表示nums中小于等于100的元素的个数
int* res = new int[3001];
for (int i = 0; i < 3001; i++) {
res[i] = 0;
}
//计算元素个数
for (int i = 0; i < nums.size(); i++) {
res[nums[i]] = ++cnt;
}
//补充完res中没计算过的元素值
for (int i = 1; i < 3001; i++) {
if (res[i] == 0) {
res[i] = res[i - 1];
}
}
cnt = 0;
for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
//可以构成三角形的个数为:边长小于前两条边之和的元素的个数 - 边长大于第一大边的元素的个数
//如 5 7 8 9 10 12 14中,5 7组合的个数为 小于12(5 + 7)的元素个数 - 大于7的元素个数
cnt += res[nums[i] + nums[j] - 1] - res[nums[j]];
//当边长出现重复时,需要加上重复边的个数,
//如5 7 7 7 7 8, nums[0] + nums[1] = 5 + 7,其组合的可能性为数组下标为2 3 4 5,其中2 3 4的值为7
for (int k = j + 1; k < nums.size(); k++) {
if (nums[k] == nums[j]) {
cnt += 1;
} else {
break;
}
}
}
}
return cnt;
}
};
代码效率: