Skip to content

Commit 443b7ce

Browse files
committed
Add solution 0611
1 parent eda4953 commit 443b7ce

File tree

6 files changed

+153
-2
lines changed

6 files changed

+153
-2
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package leetcode
2+
3+
import "sort"
4+
5+
func triangleNumber(nums []int) int {
6+
res := 0
7+
sort.Ints(nums)
8+
for i := 0; i < len(nums)-2; i++ {
9+
k := i + 2
10+
for j := i + 1; j < len(nums)-1 && nums[i] != 0; j++ {
11+
for k < len(nums) && nums[i]+nums[j] > nums[k] {
12+
k++
13+
}
14+
res += k - j - 1
15+
}
16+
}
17+
return res
18+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
type question611 struct {
9+
para611
10+
ans611
11+
}
12+
13+
// para 是参数
14+
// one 代表第一个参数
15+
type para611 struct {
16+
nums []int
17+
}
18+
19+
// ans 是答案
20+
// one 代表第一个答案
21+
type ans611 struct {
22+
one int
23+
}
24+
25+
func Test_Problem611(t *testing.T) {
26+
27+
qs := []question611{
28+
29+
{
30+
para611{[]int{2, 2, 3, 4}},
31+
ans611{3},
32+
},
33+
34+
{
35+
para611{[]int{4, 2, 3, 4}},
36+
ans611{4},
37+
},
38+
39+
{
40+
para611{[]int{0, 0}},
41+
ans611{0},
42+
},
43+
}
44+
45+
fmt.Printf("------------------------Leetcode Problem 611------------------------\n")
46+
47+
for _, q := range qs {
48+
_, p := q.ans611, q.para611
49+
fmt.Printf("【input】:%v 【output】:%v\n", p, triangleNumber(p.nums))
50+
}
51+
fmt.Printf("\n\n\n")
52+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# [611. Valid Triangle Number](https://leetcode.com/problems/valid-triangle-number/)
2+
3+
## 题目
4+
5+
Given an integer array nums, return the number of triplets chosen from the array that can make triangles if we take them as side lengths of a triangle.
6+
7+
## 题目大意
8+
9+
给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
10+
11+
## 解题思路
12+
13+
- 题意很简单,最容易想到的暴力解法是三重循环,暴力枚举,时间复杂度 O(n^3)。三重循环中最内层的循环可以优化,因为 k 和 i,j 存在关联性。第二层循环 j 从 i + 1 开始循环,k 从 j + 1 = i + 2 开始循环。循环累加 k 的值,直到 `nums[i] + nums[j] > nums[k]`,那么 `[nums[j + 1], nums[k - 1]]` 这个区间内的值都满足条件。满足条件的解个数增加 `k - j - 1` 个。j 再次递增 + 1,此时最内层的 k 不用从 j + 1 开始增加,只用从上次 k 开始增加即可。因为如果 `nums[i] + nums[j] > nums[k]`,如果这个 `nums[i] + nums[j + 1] > nums[m + 1]` 不等式成立,那么 m 一定不小于 k。所以内层循环 k 和 j 加起来的时间复杂度是 O(n),最外层 i 的循环是 O(n),这样优化以后,整体时间复杂度是 O(n^2)。
14+
- 可能有读者有疑问,三角形三条边的组成条件:任意两边之和大于第三边。`a + b > c``a + c > b``b + c > a`,此处为什么只判断了 `a + b > c` 呢?因为一开始进行了排序处理,使得 `a ≤ b ≤ c`,在这个前提下,`a + c > b``b + c > a` 是一定成立的。所以原问题便转化为只需关心 `a + b > c` 这一个不等式是否成立即可。此题的测试用例用有一种特殊情况,那就是其中一条边或者两条边长度为 0,那么 `a + b > c` 这个不等式一定不成立。综上,先排序预处理之后,只需要关心 `a + b > c` 这一个不等式是否成立即可。
15+
16+
## 代码
17+
18+
```go
19+
package leetcode
20+
21+
import "sort"
22+
23+
func triangleNumber(nums []int) int {
24+
res := 0
25+
sort.Ints(nums)
26+
for i := 0; i < len(nums)-2; i++ {
27+
k := i + 2
28+
for j := i + 1; j < len(nums)-1 && nums[i] != 0; j++ {
29+
for k < len(nums) && nums[i]+nums[j] > nums[k] {
30+
k++
31+
}
32+
res += k - j - 1
33+
}
34+
}
35+
return res
36+
}
37+
```

website/content/ChapterFour/0600~0699/0609.Find-Duplicate-File-in-System.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,5 +96,5 @@ func findDuplicate(paths []string) [][]string {
9696
----------------------------------------------
9797
<div style="display: flex;justify-content: space-between;align-items: center;">
9898
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/0600~0699/0605.Can-Place-Flowers/">⬅️上一页</a></p>
99-
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/0600~0699/0617.Merge-Two-Binary-Trees/">下一页➡️</a></p>
99+
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/0600~0699/0611.Valid-Triangle-Number/">下一页➡️</a></p>
100100
</div>
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# [611. Valid Triangle Number](https://leetcode.com/problems/valid-triangle-number/)
2+
3+
## 题目
4+
5+
Given an integer array nums, return the number of triplets chosen from the array that can make triangles if we take them as side lengths of a triangle.
6+
7+
## 题目大意
8+
9+
给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
10+
11+
## 解题思路
12+
13+
- 题意很简单,最容易想到的暴力解法是三重循环,暴力枚举,时间复杂度 O(n^3)。三重循环中最内层的循环可以优化,因为 k 和 i,j 存在关联性。第二层循环 j 从 i + 1 开始循环,k 从 j + 1 = i + 2 开始循环。循环累加 k 的值,直到 `nums[i] + nums[j] > nums[k]`,那么 `[nums[j + 1], nums[k - 1]]` 这个区间内的值都满足条件。满足条件的解个数增加 `k - j - 1` 个。j 再次递增 + 1,此时最内层的 k 不用从 j + 1 开始增加,只用从上次 k 开始增加即可。因为如果 `nums[i] + nums[j] > nums[k]`,如果这个 `nums[i] + nums[j + 1] > nums[m + 1]` 不等式成立,那么 m 一定不小于 k。所以内层循环 k 和 j 加起来的时间复杂度是 O(n),最外层 i 的循环是 O(n),这样优化以后,整体时间复杂度是 O(n^2)。
14+
- 可能有读者有疑问,三角形三条边的组成条件:任意两边之和大于第三边。`a + b > c``a + c > b``b + c > a`,此处为什么只判断了 `a + b > c` 呢?因为一开始进行了排序处理,使得 `a ≤ b ≤ c`,在这个前提下,`a + c > b``b + c > a` 是一定成立的。所以原问题便转化为只需关心 `a + b > c` 这一个不等式是否成立即可。此题的测试用例用有一种特殊情况,那就是其中一条边或者两条边长度为 0,那么 `a + b > c` 这个不等式一定不成立。综上,先排序预处理之后,只需要关心 `a + b > c` 这一个不等式是否成立即可。
15+
16+
## 代码
17+
18+
```go
19+
package leetcode
20+
21+
import "sort"
22+
23+
func triangleNumber(nums []int) int {
24+
res := 0
25+
sort.Ints(nums)
26+
for i := 0; i < len(nums)-2; i++ {
27+
k := i + 2
28+
for j := i + 1; j < len(nums)-1 && nums[i] != 0; j++ {
29+
for k < len(nums) && nums[i]+nums[j] > nums[k] {
30+
k++
31+
}
32+
res += k - j - 1
33+
}
34+
}
35+
return res
36+
}
37+
```
38+
39+
40+
----------------------------------------------
41+
<div style="display: flex;justify-content: space-between;align-items: center;">
42+
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/0600~0699/0609.Find-Duplicate-File-in-System/">⬅️上一页</a></p>
43+
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/0600~0699/0617.Merge-Two-Binary-Trees/">下一页➡️</a></p>
44+
</div>

website/content/ChapterFour/0600~0699/0617.Merge-Two-Binary-Trees.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,6 @@ func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
8282

8383
----------------------------------------------
8484
<div style="display: flex;justify-content: space-between;align-items: center;">
85-
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/0600~0699/0609.Find-Duplicate-File-in-System/">⬅️上一页</a></p>
85+
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/0600~0699/0611.Valid-Triangle-Number/">⬅️上一页</a></p>
8686
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/0600~0699/0622.Design-Circular-Queue/">下一页➡️</a></p>
8787
</div>

0 commit comments

Comments
 (0)