题目来源
题目描述
func triangleNumber(nums []int) int {
}
题目解析
简单来说,我们需要统计所有符合nums[k] + nums[j] > nums[i] 条件的(i, j, k)的个数。
为了防止统计重复的三元组,我们可以先对数组进行排序,然后采取「先枚举较大数;在下标不超过较大数下标范围内,找次大数;在下标不超过次大数下标范围内,找较小数」的策略。
暴力
class Solution {
public int triangleNumber(int[] nums) {
int n = nums.length;
Arrays.sort(nums);
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i - 1; j >= 0; j--) {
for (int k = j - 1; k >= 0; k--) {
if (nums[j] + nums[k] > nums[i]) ans++;
}
}
}
return ans;
}
}
排序 + 双指针
class Solution {
public:
int triangleNumber(vector<int>& nums) {
const int n = nums.size();
std::sort(nums.begin(),nums.end());
int ans = 0;
for(int i = n - 1; i >= 2; i--){
int l = 0, r = i - 1;
while(l < r){
if(nums[l] + nums[r] > nums[i]){
ans += (r - l);
r--;
}
else{
l++;
}
}
}
return ans;
}
};