Skip to content

Commit 4a7611a

Browse files
committed
GitBook: [master] 3 pages modified
1 parent f90fa1b commit 4a7611a

File tree

3 files changed

+108
-17
lines changed

3 files changed

+108
-17
lines changed

SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
* [剑指 Offer](docs/jzof/README.md)
99
* [OF3.数组中重复的数字](docs/jzof/of003.md)
10+
* [OF4. 二维数组中的查找](docs/jzof/of004.md)
1011
* [OF37.序列化二叉树](docs/jzof/of037.md)
1112
* [OF14-I.剪绳子](docs/jzof/of014-i.md)
1213
* [OF14-II.剪绳子](docs/jzof/of014-ii.md)

docs/jzof/of004.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
---
2+
description: 剑指 Offer 04. 二维数组中的查找
3+
---
4+
5+
# OF4. 二维数组中的查找
6+
7+
## 题目描述
8+
9+
[题目地址](https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/)
10+
11+
在一个 n \* m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
12+
13+
### **示例 1:**
14+
15+
```go
16+
输入:
17+
[
18+
[1, 4, 7, 11, 15],
19+
[2, 5, 8, 12, 19],
20+
[3, 6, 9, 16, 22],
21+
[10, 13, 14, 17, 24],
22+
[18, 21, 23, 26, 30]
23+
]
24+
给定 target = 5,返回 true
25+
给定 target = 20,返回 false
26+
```
27+
28+
## 题解
29+
30+
### 思路1 : 线性查找
31+
32+
由于给定的二维数组具备每行从左到右递增以及每列从上到下递增的特点,当访问到一个元素时,可以排除数组中的部分元素。
33+
34+
从二维数组的右上角开始查找。如果当前元素等于目标值,则返回 true。如果当前元素大于目标值,则移到左边一列。如果当前元素小于目标值,则移到下边一行。
35+
36+
可以证明这种方法不会错过目标值。如果当前元素大于目标值,说明当前元素的下边的所有元素都一定大于目标值,因此往下查找不可能找到目标值,往左查找可能找到目标值。如果当前元素小于目标值,说明当前元素的左边的所有元素都一定小于目标值,因此往左查找不可能找到目标值,往下查找可能找到目标值。
37+
38+
**算法流程:**
39+
40+
1. 若数组为空,返回 false
41+
2. 初始化行下标为 0,列下标为二维数组的列数减 1
42+
3. 重复下列步骤,直到行下标或列下标超出边界
43+
1. 获得当前下标位置的元素 num
44+
2. 如果 num 和 target 相等,返回 true
45+
3. 如果 num 大于 target,列下标减 1
46+
4. 如果 num 小于 target,行下标加 1
47+
4. 循环体执行完毕仍未找到元素等于 target ,说明不存在这样的元素,返回 false\`
48+
49+
作者:
50+
51+
**复杂度分析:**
52+
53+
* **时间复杂度**$$O(M+N)$$****访问到的下标的行最多增加 `n` 次,列最多减少 `m` 次,因此循环体最多执行 `n + m`
54+
* **空间复杂度**$$O(1)$$****
55+
56+
#### 代码
57+
58+
{% tabs %}
59+
{% tab title="Go" %}
60+
```go
61+
func findNumberIn2DArray(matrix [][]int, target int) bool {
62+
if len(matrix) == 0 {
63+
return false
64+
}
65+
rLen := len(matrix)
66+
cLen := len(matrix[0])
67+
68+
// 从右上角的元素找起来
69+
for r, c := 0, cLen-1; r < rLen && c >= 0; {
70+
if matrix[r][c] == target {
71+
return true
72+
}
73+
if matrix[r][c] > target {
74+
c--
75+
} else {
76+
r++
77+
}
78+
}
79+
return false
80+
}
81+
```
82+
{% endtab %}
83+
{% endtabs %}
84+
85+
###
86+
87+
## 总结
88+
89+
如果你同我一样热爱数据结构、算法、LeetCode,可以关注我 GitHub 上的 算法 题解:[awesome-golang-algorithm](https://github.com/kylesliu/awesome-golang-algorithm)
90+

docs/jzof/of014-i.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -61,26 +61,26 @@ $$
6161
{% tab title="Go" %}
6262
```go
6363
func cuttingRope(n int) int {
64-
dp := make(map[int]int)
65-
dp[1] = 1 // 首项
66-
for i := 2; i < n+1; i++ {
67-
j, k := 1, i-1
68-
ans := 0
69-
for j <= k {
70-
ans = max(ans, max(j, dp[j])*max(k, dp[k])) // 递推公式
71-
j++
72-
k--
73-
}
74-
dp[i] = ans
75-
}
76-
return dp[n]
64+
dp := make(map[int]int)
65+
dp[1] = 1 // 首项
66+
for i := 2; i < n+1; i++ {
67+
j, k := 1, i-1
68+
ans := 0
69+
for j <= k {
70+
ans = max(ans, max(j, dp[j])*max(k, dp[k])) // 递推公式
71+
j++
72+
k--
73+
}
74+
dp[i] = ans
75+
}
76+
return dp[n]
7777
}
7878

7979
func max(x int, y int) int {
80-
if x > y {
81-
return x
82-
}
83-
return y
80+
if x > y {
81+
return x
82+
}
83+
return y
8484
}
8585
```
8686
{% endtab %}

0 commit comments

Comments
 (0)