Skip to content

Commit 3275780

Browse files
committed
feat: add solutions to lc problem: No.0611
No.0611.Valid Triangle Number
1 parent 9f20c44 commit 3275780

File tree

5 files changed

+130
-119
lines changed

5 files changed

+130
-119
lines changed

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

+48-31
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,15 @@
4040

4141
<!-- 这里可写通用的实现逻辑 -->
4242

43-
双指针加二分,先枚举两条边,然后利用二分查找定位第三条边。
43+
**方法一:排序 + 二分查找**
44+
45+
一个有效三角形需要满足:**任意两边之和大于第三边**。即:`a + b > c`①, `a + c > b`②, `b + c > a`③。
46+
47+
如果我们将边按从小到大顺序排列,即 `a < b < c`,那么显然 ②③ 成立,我们只需要确保 ① 也成立,就可以形成一个有效三角形。
48+
49+
我们在 `[0, n-3]` 范围内枚举 i,在 `[i+1, n-2]` 范围内枚举 j,在 `[j+1, n-1]` 范围内进行二分查找,找出第一个大于等于 `nums[i]+nums[j]` 的下标 left,那么在 `[j+1, left-1]` 范围内的 k 满足条件,将其累加到结果 ans。
50+
51+
时间复杂度 O(n²logn)。
4452

4553
<!-- tabs:start -->
4654

@@ -51,19 +59,12 @@
5159
```python
5260
class Solution:
5361
def triangleNumber(self, nums: List[int]) -> int:
54-
n = len(nums)
5562
nums.sort()
56-
ans = 0
63+
ans, n = 0, len(nums)
5764
for i in range(n - 2):
5865
for j in range(i + 1, n - 1):
59-
left, right = j + 1, n
60-
while left < right:
61-
mid = left + (right - left) // 2
62-
if nums[mid] < nums[i] + nums[j]:
63-
left = mid + 1
64-
else:
65-
right = mid
66-
ans += left - j - 1
66+
k = bisect_left(nums, nums[i] + nums[j], lo=j + 1) - 1
67+
ans += k - j
6768
return ans
6869
```
6970

@@ -93,6 +94,30 @@ class Solution {
9394
}
9495
```
9596

97+
```java
98+
class Solution {
99+
public int triangleNumber(int[] nums) {
100+
Arrays.sort(nums);
101+
int ans = 0;
102+
for (int i = 0, n = nums.length; i < n - 2; ++i) {
103+
for (int j = i + 1; j < n - 1; ++j) {
104+
int left = j + 1, right = n;
105+
while (left < right) {
106+
int mid = (left + right) >> 1;
107+
if (nums[mid] >= nums[i] + nums[j]) {
108+
right = mid;
109+
} else {
110+
left = mid + 1;
111+
}
112+
}
113+
ans += left - j - 1;
114+
}
115+
}
116+
return ans;
117+
}
118+
}
119+
```
120+
96121
### **TypeScript**
97122

98123
```ts
@@ -120,18 +145,17 @@ function triangleNumber(nums: number[]): number {
120145

121146
```go
122147
func triangleNumber(nums []int) int {
123-
n := len(nums)
124148
sort.Ints(nums)
125149
ans := 0
126-
for i := 0; i < n-2; i++ {
150+
for i, n := 0, len(nums); i < n-2; i++ {
127151
for j := i + 1; j < n-1; j++ {
128152
left, right := j+1, n
129153
for left < right {
130-
mid := int(uint(left+right) >> 1)
131-
if nums[mid] < nums[i]+nums[j] {
132-
left = mid + 1
133-
} else {
154+
mid := (left + right) >> 1
155+
if nums[mid] >= nums[i]+nums[j] {
134156
right = mid
157+
} else {
158+
left = mid + 1
135159
}
136160
}
137161
ans += left - j - 1
@@ -148,20 +172,13 @@ class Solution {
148172
public:
149173
int triangleNumber(vector<int>& nums) {
150174
sort(nums.begin(), nums.end());
151-
int n = nums.size();
152-
int ans = 0;
153-
for (int i = 0; i < n - 2; ++i) {
154-
for (int j = i + 1; j < n - 1; ++j) {
155-
int left = j + 1, right = n;
156-
while (left < right) {
157-
int mid = left + right >> 1;
158-
if (nums[mid] < nums[i] + nums[j]) {
159-
left = mid + 1;
160-
} else {
161-
right = mid;
162-
}
163-
}
164-
ans += left - j - 1;
175+
int ans = 0, n = nums.size();
176+
for (int i = 0; i < n - 2; ++i)
177+
{
178+
for (int j = i + 1; j < n - 1; ++j)
179+
{
180+
int k = lower_bound(nums.begin() + j + 1, nums.end(), nums[i] + nums[j]) - nums.begin() - 1;
181+
ans += k - j;
165182
}
166183
}
167184
return ans;

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

+39-30
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,12 @@ First enumerate two edges, and then use binary search to locate the third edge.
4444
```python
4545
class Solution:
4646
def triangleNumber(self, nums: List[int]) -> int:
47-
n = len(nums)
4847
nums.sort()
49-
ans = 0
48+
ans, n = 0, len(nums)
5049
for i in range(n - 2):
5150
for j in range(i + 1, n - 1):
52-
left, right = j + 1, n
53-
while left < right:
54-
mid = left + (right - left) // 2
55-
if nums[mid] < nums[i] + nums[j]:
56-
left = mid + 1
57-
else:
58-
right = mid
59-
ans += left - j - 1
51+
k = bisect_left(nums, nums[i] + nums[j], lo=j + 1) - 1
52+
ans += k - j
6053
return ans
6154
```
6255

@@ -84,6 +77,30 @@ class Solution {
8477
}
8578
```
8679

80+
```java
81+
class Solution {
82+
public int triangleNumber(int[] nums) {
83+
Arrays.sort(nums);
84+
int ans = 0;
85+
for (int i = 0, n = nums.length; i < n - 2; ++i) {
86+
for (int j = i + 1; j < n - 1; ++j) {
87+
int left = j + 1, right = n;
88+
while (left < right) {
89+
int mid = (left + right) >> 1;
90+
if (nums[mid] >= nums[i] + nums[j]) {
91+
right = mid;
92+
} else {
93+
left = mid + 1;
94+
}
95+
}
96+
ans += left - j - 1;
97+
}
98+
}
99+
return ans;
100+
}
101+
}
102+
```
103+
87104
### **TypeScript**
88105

89106
```ts
@@ -111,18 +128,17 @@ function triangleNumber(nums: number[]): number {
111128

112129
```go
113130
func triangleNumber(nums []int) int {
114-
n := len(nums)
115131
sort.Ints(nums)
116132
ans := 0
117-
for i := 0; i < n-2; i++ {
133+
for i, n := 0, len(nums); i < n-2; i++ {
118134
for j := i + 1; j < n-1; j++ {
119135
left, right := j+1, n
120136
for left < right {
121-
mid := int(uint(left+right) >> 1)
122-
if nums[mid] < nums[i]+nums[j] {
123-
left = mid + 1
124-
} else {
137+
mid := (left + right) >> 1
138+
if nums[mid] >= nums[i]+nums[j] {
125139
right = mid
140+
} else {
141+
left = mid + 1
126142
}
127143
}
128144
ans += left - j - 1
@@ -139,20 +155,13 @@ class Solution {
139155
public:
140156
int triangleNumber(vector<int>& nums) {
141157
sort(nums.begin(), nums.end());
142-
int n = nums.size();
143-
int ans = 0;
144-
for (int i = 0; i < n - 2; ++i) {
145-
for (int j = i + 1; j < n - 1; ++j) {
146-
int left = j + 1, right = n;
147-
while (left < right) {
148-
int mid = left + right >> 1;
149-
if (nums[mid] < nums[i] + nums[j]) {
150-
left = mid + 1;
151-
} else {
152-
right = mid;
153-
}
154-
}
155-
ans += left - j - 1;
158+
int ans = 0, n = nums.size();
159+
for (int i = 0; i < n - 2; ++i)
160+
{
161+
for (int j = i + 1; j < n - 1; ++j)
162+
{
163+
int k = lower_bound(nums.begin() + j + 1, nums.end(), nums[i] + nums[j]) - nums.begin() - 1;
164+
ans += k - j;
156165
}
157166
}
158167
return ans;
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,16 @@
1-
class Solution {
2-
public:
3-
int triangleNumber(vector<int>& nums) {
4-
sort(nums.begin(), nums.end());
5-
int n = nums.size();
6-
int ans = 0;
7-
for (int i = 0; i < n - 2; ++i) {
8-
for (int j = i + 1; j < n - 1; ++j) {
9-
int left = j + 1, right = n;
10-
while (left < right) {
11-
int mid = left + right >> 1;
12-
if (nums[mid] < nums[i] + nums[j]) {
13-
left = mid + 1;
14-
} else {
15-
right = mid;
16-
}
17-
}
18-
ans += left - j - 1;
19-
}
20-
}
21-
return ans;
22-
}
1+
class Solution {
2+
public:
3+
int triangleNumber(vector<int>& nums) {
4+
sort(nums.begin(), nums.end());
5+
int ans = 0, n = nums.size();
6+
for (int i = 0; i < n - 2; ++i)
7+
{
8+
for (int j = i + 1; j < n - 1; ++j)
9+
{
10+
int k = lower_bound(nums.begin() + j + 1, nums.end(), nums[i] + nums[j]) - nums.begin() - 1;
11+
ans += k - j;
12+
}
13+
}
14+
return ans;
15+
}
2316
};
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
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-
}
1+
func triangleNumber(nums []int) int {
2+
sort.Ints(nums)
3+
ans := 0
4+
for i, n := 0, len(nums); i < n-2; i++ {
5+
for j := i + 1; j < n-1; j++ {
6+
left, right := j+1, n
7+
for left < right {
8+
mid := (left + right) >> 1
9+
if nums[mid] >= nums[i]+nums[j] {
10+
right = mid
11+
} else {
12+
left = mid + 1
13+
}
14+
}
15+
ans += left - j - 1
16+
}
17+
}
18+
return ans
19+
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
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(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
1+
class Solution:
2+
def triangleNumber(self, nums: List[int]) -> int:
3+
nums.sort()
4+
ans, n = 0, len(nums)
5+
for i in range(n - 2):
6+
for j in range(i + 1, n - 1):
7+
k = bisect_left(nums, nums[i] + nums[j], lo=j + 1) - 1
8+
ans += k - j
9+
return ans

0 commit comments

Comments
 (0)