__________________________________________________________________________________________________
sample 12 ms submission
class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int res = 0;
        
        for (auto i = nums.cend(); i != nums.cbegin();) {
            --i;
            auto iv = *i;
            
            auto j = nums.cbegin();
            auto k = i;
            --k;
            while(j < k) {
                if (*j + *k > iv) {
                    res += distance(j, k);
                    --k;
                } else {
                    ++j;
                }
            }
        }
        
        return res;
    }
};
__________________________________________________________________________________________________
sample 9656 kb submission
class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        int ans = 0;
        if(nums.size() < 3) {
            return ans;
        }
        
        sort(nums.begin(), nums.end());
        for(int i = 0; i < nums.size() - 2; ++ i){
            for(int j = i + 1; j < nums.size() - 1; ++ j){
                ans += getNumOfTriangles(nums[i] + nums[j], j, nums);
            }
        }
        return ans;
    }
    
private:
    int getNumOfTriangles(int upbnd, int start, vector<int>& nums){
        int l = start + 1, r = nums.size() - 1;
        int res = start;
        while(l <= r){
            int mid = (l + r)>>1;
            if(nums[mid] < upbnd){
                res = max(res, mid);
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return res - start;
    }
};
__________________________________________________________________________________________________