0双指针中等 LeetCode611. 有效三角形的个数

611. 有效三角形的个数

描述

给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。

示例 1:

输入: nums = [2,2,3,4]
输出: 3
解释:有效的组合是: 
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
示例 2:

输入: nums = [4,2,3,4]
输出: 4
 

提示:

1 <= nums.length <= 1000
0 <= nums[i] <= 1000
通过次数70,409提交次数131,303

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-triangle-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析

有效三角的判断公式:a+b>c (a,b小于等于c)
双指针解法:
固定最大值,然后双指针遍历固定最大值的左侧区域。(不可以固定最小值,双指针遍历右侧区域,这样行不通)
若nums[j]+ nums[k] > nums[i]则 j+1~k-1之间的值都是满足条件的,直接加入到结果。
若nums[j]+ nums[k] <= nums[i] 则一直增加j。
一直缩小k直到j与k相遇

class Solution {
    public int triangleNumber(int[] nums) {
        Arrays.sort(nums);
        int ans = 0;
        for (int i = nums.length - 1; i >= 2; i--) {
            int j = 0;
            int k = i-1;
            while (j < k) {
                while (j < k && nums[j]+ nums[k] <= nums[i]) {
                    j++;
                }
                if (j != k) {
                    ans += k - j;
                }
                k--;
            }
        }
        return ans;
    }
}

你可能感兴趣的:(算法,leetcode,数据结构)