Skip to content

Commit 634e64c

Browse files
committed
feat: add solutions to lc problem: No.0611.Valid Triangle Number
1 parent ba6cc98 commit 634e64c

File tree

4 files changed

+160
-4
lines changed

4 files changed

+160
-4
lines changed

solution/0600-0699/0611.Valid Triangle Number/README.md

+62-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<strong>输入:</strong> [2,2,3,4]
1515
<strong>输出:</strong> 3
1616
<strong>解释:</strong>
17-
有效的组合是:
17+
有效的组合是:
1818
2,3,4 (使用第一个 2)
1919
2,3,4 (使用第二个 2)
2020
2,2,3
@@ -32,22 +32,82 @@
3232

3333
<!-- 这里可写通用的实现逻辑 -->
3434

35+
双指针加二分,先枚举两条边,然后利用二分查找定位第三条边
36+
3537
<!-- tabs:start -->
3638

3739
### **Python3**
3840

3941
<!-- 这里可写当前语言的特殊实现逻辑 -->
4042

4143
```python
42-
44+
class Solution:
45+
def triangleNumber(self, nums: List[int]) -> int:
46+
n = len(nums)
47+
nums.sort()
48+
ans = 0
49+
for i in range(0, n - 2):
50+
for j in range(i + 1, n - 1):
51+
left, right = j + 1, n
52+
while left < right:
53+
mid = left + (right - left) // 2
54+
if nums[mid] < nums[i] + nums[j]:
55+
left = mid + 1
56+
else:
57+
right = mid
58+
ans += left - j - 1
59+
return ans
4360
```
4461

4562
### **Java**
4663

4764
<!-- 这里可写当前语言的特殊实现逻辑 -->
4865

4966
```java
67+
class Solution {
68+
public int triangleNumber(int[] nums) {
69+
Arrays.sort(nums);
70+
int n = nums.length;
71+
int res = 0;
72+
for (int i = n - 1; i >= 2; --i) {
73+
int l = 0, r = i - 1;
74+
while (l < r) {
75+
if (nums[l] + nums[r] > nums[i]) {
76+
res += r - l;
77+
--r;
78+
} else {
79+
++l;
80+
}
81+
}
82+
}
83+
return res;
84+
}
85+
}
86+
```
5087

88+
### **Go**
89+
90+
```go
91+
func triangleNumber(nums []int) int {
92+
n := len(nums)
93+
sort.Ints(nums)
94+
ans := 0
95+
for i := 0; i < n-2; i++ {
96+
for j := i + 1; j < n-1; j++ {
97+
left, right := j+1, n
98+
for left < right {
99+
mid := int(uint(left+right) >> 1)
100+
if nums[mid] < nums[i]+nums[j] {
101+
left = mid + 1
102+
} else {
103+
right = mid
104+
}
105+
}
106+
ans += left - j - 1
107+
}
108+
}
109+
return ans
110+
}
51111
```
52112

53113
### **...**

solution/0600-0699/0611.Valid Triangle Number/README_EN.md

+62-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Given an array consists of non-negative integers, your task is to count the num
1818

1919
<b>Explanation:</b>
2020

21-
Valid combinations are:
21+
Valid combinations are:
2222

2323
2,3,4 (using the first 2)
2424

@@ -48,18 +48,78 @@ Valid combinations are:
4848

4949
## Solutions
5050

51+
First enumerate two edges, and then use binary search to locate the third edge.
52+
5153
<!-- tabs:start -->
5254

5355
### **Python3**
5456

5557
```python
56-
58+
class Solution:
59+
def triangleNumber(self, nums: List[int]) -> int:
60+
n = len(nums)
61+
nums.sort()
62+
ans = 0
63+
for i in range(0, n - 2):
64+
for j in range(i + 1, n - 1):
65+
left, right = j + 1, n
66+
while left < right:
67+
mid = left + (right - left) // 2
68+
if nums[mid] < nums[i] + nums[j]:
69+
left = mid + 1
70+
else:
71+
right = mid
72+
ans += left - j - 1
73+
return ans
5774
```
5875

5976
### **Java**
6077

6178
```java
79+
class Solution {
80+
public int triangleNumber(int[] nums) {
81+
Arrays.sort(nums);
82+
int n = nums.length;
83+
int res = 0;
84+
for (int i = n - 1; i >= 2; --i) {
85+
int l = 0, r = i - 1;
86+
while (l < r) {
87+
if (nums[l] + nums[r] > nums[i]) {
88+
res += r - l;
89+
--r;
90+
} else {
91+
++l;
92+
}
93+
}
94+
}
95+
return res;
96+
}
97+
}
98+
```
6299

100+
### **Go**
101+
102+
```go
103+
func triangleNumber(nums []int) int {
104+
n := len(nums)
105+
sort.Ints(nums)
106+
ans := 0
107+
for i := 0; i < n-2; i++ {
108+
for j := i + 1; j < n-1; j++ {
109+
left, right := j+1, n
110+
for left < right {
111+
mid := int(uint(left+right) >> 1)
112+
if nums[mid] < nums[i]+nums[j] {
113+
left = mid + 1
114+
} else {
115+
right = mid
116+
}
117+
}
118+
ans += left - j - 1
119+
}
120+
}
121+
return ans
122+
}
63123
```
64124

65125
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
func triangleNumber(nums []int) int {
2+
n := len(nums)
3+
sort.Ints(nums)
4+
ans := 0
5+
for i := 0; i < n-2; i++ {
6+
for j := i + 1; j < n-1; j++ {
7+
left, right := j+1, n
8+
for left < right {
9+
mid := int(uint(left+right) >> 1)
10+
if nums[mid] < nums[i]+nums[j] {
11+
left = mid + 1
12+
} else {
13+
right = mid
14+
}
15+
}
16+
ans += left - j - 1
17+
}
18+
}
19+
return ans
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def triangleNumber(self, nums: List[int]) -> int:
3+
n = len(nums)
4+
nums.sort()
5+
ans = 0
6+
for i in range(0, n - 2):
7+
for j in range(i + 1, n - 1):
8+
left, right = j + 1, n
9+
while left < right:
10+
mid = left + (right - left) // 2
11+
if nums[mid] < nums[i] + nums[j]:
12+
left = mid + 1
13+
else:
14+
right = mid
15+
ans += left - j - 1
16+
return ans

0 commit comments

Comments
 (0)