while(l < r){
int mid =(l + r + 1)>>1;if(nums[mid]< nums[i] + nums[j]) l = mid ;else r = mid-1 ;}
class Solution {
public:
int triangleNumber(vector<int>& nums){
sort(nums.begin(),nums.end());
int ans=0;
if(nums.size()<3){return ans;}for(int i =0; i < nums.size()-2; i++){for(int j = i+1; j <nums.size()-1; j++){
int l = j+1, r = nums.size()-1 ;
// 二分法会停止,即使区间中不存在满足条件的值,所以要在查找之前(或找到之后)做个判断
if(nums[i] + nums[j]> nums[l]){}else{continue;}
if(l==r){
if(nums[i] + nums[j]> nums[l]){
cout<<"-";
ans++;break;}else{break;}}while(l < r){
int mid =(l + r + 1)>>1;if(nums[i] + nums[j]> nums[mid]) l = mid ;else r = mid-1 ;}ans+= l-(j);//l-(j+1)+1;}}return ans;}};
优化
class Solution {
public:
int triangleNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
int ans=0;
for (int i = 0; i < nums.size(); i++) {
for (int j = i+1; j <nums.size(); j++) {
int l = j, r = nums.size()-1 ;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (nums[i] + nums[j] > nums[mid]) l = mid ;
else r = mid-1 ;
}
ans+= l-j;
}
}
return ans;
}
};