611. 有效三角形的个数

题目:

思路:

【1】这种其实常规的会想到树的方式处理,因为每三个数值都是可以作为一个组合,树遍历的方式更加通俗,但是其实可以用双指针的方式进行优化。

代码展示:

//时间230 ms 击败 35.95%
//内存42 MB 击败 49.31%
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 < n; ++j) {
                int left = j + 1, right = n - 1, k = j;
                while (left <= right) {
                    int mid = (left + right) / 2;
                    if (nums[mid] < nums[i] + nums[j]) {
                        k = mid;
                        left = mid + 1;
                    } else {
                        right = mid - 1;
                    }
                }
                ans += k - j;
            }
        }
        return ans;
    }
}


//时间28 ms 击败 91.3%
//内存41.9 MB 击败 74.92%
class Solution {
    public int triangleNumber(int[] nums) {
        Arrays.sort(nums);
        int ans = 0;
        int n = nums.length;
         for (int i = n - 1; i >= 2; --i) {
            int left = 0, right = i - 1;
            while(left < right) {
                if (nums[left] + nums[right] > nums[i]) {
                    //为什么是right-left?比如 1 2 3 4 5 6
                    //当i=5,left=1,right=4时,有right-left=3种可能
                    //即2 5 6 、3 5 6 、4 5 6,不是2 5 、5 2 、3 4、4 3这样算
                    ans += right - left;
                    right--;
                }else {
                    left++;
                }
            }
        }
        return ans;
    }

}

 

posted @ 2023-08-14 18:24  忧愁的chafry  阅读(6)  评论(0编辑  收藏  举报