【力扣-算法】611.有效三角形的个数

目录

1.题目描述

2.题目解析

3.代码实现

4.源码


1.题目描述

【力扣-算法】611.有效三角形的个数_第1张图片

2.题目解析

        2.1 根据题目,我们都知道三角形的任意两条边大于另一条边就是有效三角形,那么我们只需要穷举数组每三个数的组合便能得到有效三角形组的个数,用三个循环嵌套就能实现但时间复杂到达O(n^3),太慢了,有没有其他的方式呢?

        2.2 在上述我们得到了三条边中任意两条大于另一条为有效三角形,即:

                a + b > c,b + c > a,a + c > b

                假设,a <= b <= c,那么c作为三个数中的最大值,不管和其他两个相加都会大于另外一个(因为c本身就比他大),那么在此基础上我们只需要去比较其他两个数相加是否大于c就可以了

                怎么实现呢?把数组变成有序数组(以下我们用升序数组举例)

int[] nums = {4,2,3,4};
Arrays.sort(nums);//{2,3,4,4}

               在数值中取最大值(数组升序,最右边的元素为最大值)作为分割元素把数组分为两个区域:

                待处理区:没有进行组合的数,用区域中最大值和最小值进行,同时也是待处理区中左右两边的数,用left和right

                已处理区:在比较的过程中利用单调性,在left和right进行比较时,如果left和right加在一起小于分割元素,那么比right小的数跟left相加就更加不可能大于分割元素,那么left就没有组合的比较进入已处理区,而right在跟left相加以后大于分割元素那么中间都大于left就无需比较,通过right 减 left 得到待处理区中除right以外剩下的元素个数就是有效组合的个数

                分割元素:在left和right比较中left在不断变大right在不断变小最终两者相交或相等,为完成一次分割元素跟待处理区的组合,之后需要重置待处理区,分割元素也加一进行下一轮比较

3.代码实现

        先设置分割元素和记录有效个数的元素

int max = nums.length - 1;
        int count = 0;

          用两个循环来进行处理,一个用来控制left和right和分割元素做比较,一个用来对控制分割元素遍历

while(max > 1){
    int left = 0, right = max - 1;
    while(left < right){
        int sum = nums[left] + nums[right];
        if(sum > nums[max]){
            count = count + right - left;
            right--;
        }else left++;

    }
    max--;
}

4.源码

package test;

import java.util.Arrays;

public class test611 {
    public int triangleNumber(int[] nums) {
        Arrays.sort(nums);
        int max = nums.length - 1;
        int count = 0;
        while(max > 1){
            int left = 0, right = max - 1;
            while(left < right){
                int sum = nums[left] + nums[right];
                if(sum > nums[max]){
                    count = count + right - left;
                    right--;
                }else left++;
            }
            max--;
        }
        return count;
    }

    public static void main(String[] args) {
        int[] arr = {2,2,3,4};
        test611 t = new test611();
        System.out.println(t.triangleNumber(arr));

    }
}

               

                

你可能感兴趣的:(leetcode,力扣,算法,java)