[LeetCode]Valid Triangle Number

栏目: 编程工具 · 发布时间: 9年前

内容简介:[LeetCode]Valid Triangle Number

题目描述:

LeetCode 611. Valid Triangle Number

Given an array consists of non-negative integers, your task is to count the number of triplets chosen from the array that can make triangles if we take them as side lengths of a triangle.

Example 1:

Input: [2,2,3,4]
Output: 3
Explanation:
Valid combinations are: 
2,3,4 (using the first 2)
2,3,4 (using the second 2)
2,2,3

Note:

  1. The length of the given array won't exceed 1000.
  2. The integers in the given array are in the range of [0, 1000].

题目大意:

给定非负整数数组,求其中可以组成三角形的三元组的个数。

解题思路:

解法I 排序(Sort) + 二分查找(Binary Search)

时间复杂度O( n^2 * log(n) )

对输入数组nums排序

枚举长度较小的两条边,利用二分查找符合条件的最大边的下标。

Java代码:

public class Solution {
    
    public int binarySearch(int[] nums, int start, int target) {
        int left = start, right = nums.length - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] >= target) right = mid - 1;
            else left = mid + 1;
        }
        return left;
    }
    
    public int triangleNumber(int[] nums) {
        Arrays.sort(nums);
        int size = nums.length;
        int ans = 0;
        for (int i = 0; i < size - 2; i++) {
            for (int j = i + 1; j < size - 1; j++) {
                int k = binarySearch(nums, j + 1, nums[i] + nums[j]);
                ans += k - j - 1;
            }
        }
        return ans;
    }

}

解法II 排序(Sort) + 双指针(Two Pointers)

时间复杂度O(n^2)

对输入数组nums排序

枚举长度最小的边,利用双指针寻找符合条件的长度较大的两条边。

感谢网友 @翼灵贰駟 补充(http://weibo.com/shohku11wrj)

Java代码:

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

}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

科学计算导论

科学计算导论

希思 / 清华大学出版社 / 2005-10 / 48.00元

本书全面地介绍了科学计算中解各种主要问题的数值方法,包括线性和非线性方程、最小二乘法、特征值、最优化、插值、积分、常微分方程和偏微分方程、快速傅里叶变换和随机数生成。 本书的特点是: 以使用算法的读者为对象,重点讲授算法背后的思想和原理,而不是算法的详细分析。 强调敏感性和病态性等概念,对同一问题的不同算法进行比较和评价,提高读者对算法的鉴赏能力。 对每类......一起来看看 《科学计算导论》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具