Skip to content

Commit 7468234

Browse files
committed
添加 problem 498
1 parent 2fed35c commit 7468234

File tree

3 files changed

+246
-0
lines changed

3 files changed

+246
-0
lines changed
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package leetcode
2+
3+
// 解法一
4+
func findDiagonalOrder1(matrix [][]int) []int {
5+
if matrix == nil || len(matrix) == 0 || len(matrix[0]) == 0 {
6+
return nil
7+
}
8+
row := len(matrix)
9+
col := len(matrix[0])
10+
dir := [2][2]int{
11+
{-1, 1},
12+
{1, -1},
13+
}
14+
total := row * col
15+
res := make([]int, total)
16+
var i, x, y, d int
17+
for i < total {
18+
for x >= 0 && x < row && y >= 0 && y < col {
19+
res[i] = matrix[x][y]
20+
i++
21+
x += dir[d][0]
22+
y += dir[d][1]
23+
}
24+
d = (d + 1) % 2
25+
if x == row {
26+
x--
27+
y += 2
28+
}
29+
if y == col {
30+
y--
31+
x += 2
32+
}
33+
if x < 0 {
34+
x = 0
35+
}
36+
if y < 0 {
37+
y = 0
38+
}
39+
}
40+
return res
41+
}
42+
43+
// 解法二
44+
func findDiagonalOrder(matrix [][]int) []int {
45+
if len(matrix) == 0 {
46+
return []int{}
47+
}
48+
if len(matrix) == 1 {
49+
return matrix[0]
50+
}
51+
// dir = 0 代表从右上到左下的方向, dir = 1 代表从左下到右上的方向 dir = -1 代表上一次转变了方向
52+
m, n, i, j, dir, res := len(matrix), len(matrix[0]), 0, 0, 0, []int{}
53+
for index := 0; index < m*n; index++ {
54+
if dir == -1 {
55+
if (i == 0 && j < n-1) || (j == n-1) { // 上边界和右边界
56+
i++
57+
if j > 0 {
58+
j--
59+
}
60+
dir = 0
61+
addTraverse(matrix, i, j, &res)
62+
continue
63+
}
64+
if (j == 0 && i < m-1) || (i == m-1) { // 左边界和下边界
65+
if i > 0 {
66+
i--
67+
}
68+
j++
69+
dir = 1
70+
addTraverse(matrix, i, j, &res)
71+
continue
72+
}
73+
}
74+
if i == 0 && j == 0 {
75+
res = append(res, matrix[i][j])
76+
if j < n-1 {
77+
j++
78+
dir = -1
79+
addTraverse(matrix, i, j, &res)
80+
continue
81+
} else {
82+
if i < m-1 {
83+
i++
84+
dir = -1
85+
addTraverse(matrix, i, j, &res)
86+
continue
87+
}
88+
}
89+
}
90+
if i == 0 && j < n-1 { // 上边界
91+
if j < n-1 {
92+
j++
93+
dir = -1
94+
addTraverse(matrix, i, j, &res)
95+
continue
96+
}
97+
}
98+
if j == 0 && i < m-1 { // 左边界
99+
if i < m-1 {
100+
i++
101+
dir = -1
102+
addTraverse(matrix, i, j, &res)
103+
continue
104+
}
105+
}
106+
if j == n-1 { // 右边界
107+
if i < m-1 {
108+
i++
109+
dir = -1
110+
addTraverse(matrix, i, j, &res)
111+
continue
112+
}
113+
}
114+
if i == m-1 { // 下边界
115+
j++
116+
dir = -1
117+
addTraverse(matrix, i, j, &res)
118+
continue
119+
}
120+
if dir == 1 {
121+
i--
122+
j++
123+
addTraverse(matrix, i, j, &res)
124+
continue
125+
}
126+
if dir == 0 {
127+
i++
128+
j--
129+
addTraverse(matrix, i, j, &res)
130+
continue
131+
}
132+
}
133+
return res
134+
}
135+
136+
func addTraverse(matrix [][]int, i, j int, res *[]int) {
137+
if i >= 0 && i <= len(matrix)-1 && j >= 0 && j <= len(matrix[0])-1 {
138+
*res = append(*res, matrix[i][j])
139+
}
140+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
type question498 struct {
9+
para498
10+
ans498
11+
}
12+
13+
// para 是参数
14+
// one 代表第一个参数
15+
type para498 struct {
16+
one [][]int
17+
}
18+
19+
// ans 是答案
20+
// one 代表第一个答案
21+
type ans498 struct {
22+
one []int
23+
}
24+
25+
func Test_Problem498(t *testing.T) {
26+
27+
qs := []question498{
28+
29+
question498{
30+
para498{[][]int{[]int{3}, []int{2}, []int{9}}},
31+
ans498{[]int{3, 2, 9}},
32+
},
33+
34+
question498{
35+
para498{[][]int{[]int{6, 9, 7}}},
36+
ans498{[]int{6, 9, 7}},
37+
},
38+
39+
question498{
40+
para498{[][]int{[]int{3}, []int{2}}},
41+
ans498{[]int{3, 2}},
42+
},
43+
44+
question498{
45+
para498{[][]int{[]int{1, 2, 3}, []int{4, 5, 6}, []int{7, 8, 9}}},
46+
ans498{[]int{1, 2, 4, 7, 5, 3, 6, 8, 9}},
47+
},
48+
49+
question498{
50+
para498{[][]int{[]int{0}}},
51+
ans498{[]int{0}},
52+
},
53+
54+
question498{
55+
para498{[][]int{[]int{}}},
56+
ans498{[]int{}},
57+
},
58+
}
59+
60+
fmt.Printf("------------------------Leetcode Problem 498------------------------\n")
61+
62+
for _, q := range qs {
63+
_, p := q.ans498, q.para498
64+
fmt.Printf("【input】:%v 【output】:%v\n", p, findDiagonalOrder(p.one))
65+
}
66+
fmt.Printf("\n\n\n")
67+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# [498. Diagonal Traverse](https://leetcode.com/problems/diagonal-traverse/)
2+
3+
4+
## 题目:
5+
6+
Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.
7+
8+
**Example:**
9+
10+
Input:
11+
[
12+
[ 1, 2, 3 ],
13+
[ 4, 5, 6 ],
14+
[ 7, 8, 9 ]
15+
]
16+
17+
Output: [1,2,4,7,5,3,6,8,9]
18+
19+
Explanation:
20+
21+
![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/12/diagonal_traverse.png)
22+
23+
**Note:**
24+
25+
The total number of elements of the given matrix will not exceed 10,000.
26+
27+
28+
## 题目大意
29+
30+
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
31+
32+
![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/12/diagonal_traverse.png)
33+
34+
说明: 给定矩阵中的元素总数不会超过 100000 。
35+
36+
## 解题思路
37+
38+
- 给出一个二维数组,要求按照如图的方式遍历整个数组。
39+
- 这一题用模拟的方式就可以解出来。需要注意的是边界条件:比如二维数组为空,二维数组退化为一行或者一列,退化为一个元素。具体例子见测试用例。

0 commit comments

Comments
 (0)