【LeetCode】611.Valid Triangle Number解题报告
来源:互联网 发布:52单片机引脚图 编辑:程序博客网 时间:2024/06/17 17:24
【LeetCode】611.Valid Triangle Number解题报告
tags: Array
题目地址:https://leetcode.com/problems/valid-triangle-number/description/
题目描述:
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.
Examples:
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:
The length of the given array won’t exceed 1000.
The integers in the given array are in the range of [0, 1000].
Solutions:
解法一:暴力解法,三层循环,算出所有三个数的情况,显然超时。时间复杂度O(n³),空间复杂度O(1)。
public class Solution { public int triangleNumber(int[] nums) { int count = 0; for (int i = 0; i < nums.length - 2; i++) { for (int j = i + 1; j < nums.length - 1; j++) { for (int k = j + 1; k < nums.length; k++) { if (nums[i] + nums[j] > nums[k] && nums[i] + nums[k] > nums[j] && nums[j] + nums[k] > nums[i]) count++; } } } I return count; }}
解法二:排序—+二分查找,对输入数组nums排序,美剧长度最小的两条边,利用二分查找符合条件的最大边的下标。时间复杂度O(n²logn),空间复杂度O(logn)。
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; }}
解法三:排序+双指针,对输入数组nums排序,枚举最小的边,利用双指针寻找符合条件的长度最大的两条边。时间复杂度O(n²),空间复杂度O(logn)。
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; }}
Date:2017年7月29日
- 【LeetCode】611.Valid Triangle Number解题报告
- 【LeetCode】Valid Number 解题报告
- [LeetCode]611. Valid Triangle Number
- [LeetCode] 611. Valid Triangle Number
- [leetcode]611. Valid Triangle Number
- leetcode 611. Valid Triangle Number
- [leetcode] 611. Valid Triangle Number
- Leetcode:611. Valid Triangle Number
- leetcode 611. Valid Triangle Number
- [leetcode] 65. Valid Number 解题报告
- [Leetcode] 65. Valid Number 解题报告
- leetCode-Valid Triangle Number
- Leetcode Triangle 解题报告
- 【LeetCode】Triangle 解题报告
- [LeetCode] Triangle 解题报告
- Leetcode 65. Valid Number 验证数字 解题报告
- [LeetCode 611] Valid Triangle Number
- 611. Valid Triangle Number
- 【概念的辨异】—— ISO C 与 POSIX C(C standard library 与 C POSIX library)
- iOS-常见的页面传值方式
- Java日志框架梳理-SLF4J+log4j
- A1027
- 求 TOPK 的三种方法及分析
- 【LeetCode】611.Valid Triangle Number解题报告
- ios相关的一些知识
- selenium+python自动化测试(二)--使用webdriver操作浏览器
- fragment中使用replace创建新的fragment遇到的层级错乱问题的一种解决方案
- 设计一个针对全球的、访问量极大的id生成系统。 必须保证用户每次从该系统得到的id是唯一的,而且在概率上毫无碰撞可能。
- c语言的内存管理
- 应用经验 项目 基于51的数据采集系统感想(科技)
- L
- 53. Maximum Subarray