mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2026-03-13 10:02:05 +08:00
添加 problem 498
This commit is contained in:
140
Algorithms/0498. Diagonal Traverse/498. Diagonal Traverse.go
Normal file
140
Algorithms/0498. Diagonal Traverse/498. Diagonal Traverse.go
Normal file
@@ -0,0 +1,140 @@
|
||||
package leetcode
|
||||
|
||||
// 解法一
|
||||
func findDiagonalOrder1(matrix [][]int) []int {
|
||||
if matrix == nil || len(matrix) == 0 || len(matrix[0]) == 0 {
|
||||
return nil
|
||||
}
|
||||
row := len(matrix)
|
||||
col := len(matrix[0])
|
||||
dir := [2][2]int{
|
||||
{-1, 1},
|
||||
{1, -1},
|
||||
}
|
||||
total := row * col
|
||||
res := make([]int, total)
|
||||
var i, x, y, d int
|
||||
for i < total {
|
||||
for x >= 0 && x < row && y >= 0 && y < col {
|
||||
res[i] = matrix[x][y]
|
||||
i++
|
||||
x += dir[d][0]
|
||||
y += dir[d][1]
|
||||
}
|
||||
d = (d + 1) % 2
|
||||
if x == row {
|
||||
x--
|
||||
y += 2
|
||||
}
|
||||
if y == col {
|
||||
y--
|
||||
x += 2
|
||||
}
|
||||
if x < 0 {
|
||||
x = 0
|
||||
}
|
||||
if y < 0 {
|
||||
y = 0
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
// 解法二
|
||||
func findDiagonalOrder(matrix [][]int) []int {
|
||||
if len(matrix) == 0 {
|
||||
return []int{}
|
||||
}
|
||||
if len(matrix) == 1 {
|
||||
return matrix[0]
|
||||
}
|
||||
// dir = 0 代表从右上到左下的方向, dir = 1 代表从左下到右上的方向 dir = -1 代表上一次转变了方向
|
||||
m, n, i, j, dir, res := len(matrix), len(matrix[0]), 0, 0, 0, []int{}
|
||||
for index := 0; index < m*n; index++ {
|
||||
if dir == -1 {
|
||||
if (i == 0 && j < n-1) || (j == n-1) { // 上边界和右边界
|
||||
i++
|
||||
if j > 0 {
|
||||
j--
|
||||
}
|
||||
dir = 0
|
||||
addTraverse(matrix, i, j, &res)
|
||||
continue
|
||||
}
|
||||
if (j == 0 && i < m-1) || (i == m-1) { // 左边界和下边界
|
||||
if i > 0 {
|
||||
i--
|
||||
}
|
||||
j++
|
||||
dir = 1
|
||||
addTraverse(matrix, i, j, &res)
|
||||
continue
|
||||
}
|
||||
}
|
||||
if i == 0 && j == 0 {
|
||||
res = append(res, matrix[i][j])
|
||||
if j < n-1 {
|
||||
j++
|
||||
dir = -1
|
||||
addTraverse(matrix, i, j, &res)
|
||||
continue
|
||||
} else {
|
||||
if i < m-1 {
|
||||
i++
|
||||
dir = -1
|
||||
addTraverse(matrix, i, j, &res)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
if i == 0 && j < n-1 { // 上边界
|
||||
if j < n-1 {
|
||||
j++
|
||||
dir = -1
|
||||
addTraverse(matrix, i, j, &res)
|
||||
continue
|
||||
}
|
||||
}
|
||||
if j == 0 && i < m-1 { // 左边界
|
||||
if i < m-1 {
|
||||
i++
|
||||
dir = -1
|
||||
addTraverse(matrix, i, j, &res)
|
||||
continue
|
||||
}
|
||||
}
|
||||
if j == n-1 { // 右边界
|
||||
if i < m-1 {
|
||||
i++
|
||||
dir = -1
|
||||
addTraverse(matrix, i, j, &res)
|
||||
continue
|
||||
}
|
||||
}
|
||||
if i == m-1 { // 下边界
|
||||
j++
|
||||
dir = -1
|
||||
addTraverse(matrix, i, j, &res)
|
||||
continue
|
||||
}
|
||||
if dir == 1 {
|
||||
i--
|
||||
j++
|
||||
addTraverse(matrix, i, j, &res)
|
||||
continue
|
||||
}
|
||||
if dir == 0 {
|
||||
i++
|
||||
j--
|
||||
addTraverse(matrix, i, j, &res)
|
||||
continue
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func addTraverse(matrix [][]int, i, j int, res *[]int) {
|
||||
if i >= 0 && i <= len(matrix)-1 && j >= 0 && j <= len(matrix[0])-1 {
|
||||
*res = append(*res, matrix[i][j])
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package leetcode
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type question498 struct {
|
||||
para498
|
||||
ans498
|
||||
}
|
||||
|
||||
// para 是参数
|
||||
// one 代表第一个参数
|
||||
type para498 struct {
|
||||
one [][]int
|
||||
}
|
||||
|
||||
// ans 是答案
|
||||
// one 代表第一个答案
|
||||
type ans498 struct {
|
||||
one []int
|
||||
}
|
||||
|
||||
func Test_Problem498(t *testing.T) {
|
||||
|
||||
qs := []question498{
|
||||
|
||||
question498{
|
||||
para498{[][]int{[]int{3}, []int{2}, []int{9}}},
|
||||
ans498{[]int{3, 2, 9}},
|
||||
},
|
||||
|
||||
question498{
|
||||
para498{[][]int{[]int{6, 9, 7}}},
|
||||
ans498{[]int{6, 9, 7}},
|
||||
},
|
||||
|
||||
question498{
|
||||
para498{[][]int{[]int{3}, []int{2}}},
|
||||
ans498{[]int{3, 2}},
|
||||
},
|
||||
|
||||
question498{
|
||||
para498{[][]int{[]int{1, 2, 3}, []int{4, 5, 6}, []int{7, 8, 9}}},
|
||||
ans498{[]int{1, 2, 4, 7, 5, 3, 6, 8, 9}},
|
||||
},
|
||||
|
||||
question498{
|
||||
para498{[][]int{[]int{0}}},
|
||||
ans498{[]int{0}},
|
||||
},
|
||||
|
||||
question498{
|
||||
para498{[][]int{[]int{}}},
|
||||
ans498{[]int{}},
|
||||
},
|
||||
}
|
||||
|
||||
fmt.Printf("------------------------Leetcode Problem 498------------------------\n")
|
||||
|
||||
for _, q := range qs {
|
||||
_, p := q.ans498, q.para498
|
||||
fmt.Printf("【input】:%v 【output】:%v\n", p, findDiagonalOrder(p.one))
|
||||
}
|
||||
fmt.Printf("\n\n\n")
|
||||
}
|
||||
39
Algorithms/0498. Diagonal Traverse/README.md
Executable file
39
Algorithms/0498. Diagonal Traverse/README.md
Executable file
@@ -0,0 +1,39 @@
|
||||
# [498. Diagonal Traverse](https://leetcode.com/problems/diagonal-traverse/)
|
||||
|
||||
|
||||
## 题目:
|
||||
|
||||
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.
|
||||
|
||||
**Example:**
|
||||
|
||||
Input:
|
||||
[
|
||||
[ 1, 2, 3 ],
|
||||
[ 4, 5, 6 ],
|
||||
[ 7, 8, 9 ]
|
||||
]
|
||||
|
||||
Output: [1,2,4,7,5,3,6,8,9]
|
||||
|
||||
Explanation:
|
||||
|
||||

|
||||
|
||||
**Note:**
|
||||
|
||||
The total number of elements of the given matrix will not exceed 10,000.
|
||||
|
||||
|
||||
## 题目大意
|
||||
|
||||
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
|
||||
|
||||

|
||||
|
||||
说明: 给定矩阵中的元素总数不会超过 100000 。
|
||||
|
||||
## 解题思路
|
||||
|
||||
- 给出一个二维数组,要求按照如图的方式遍历整个数组。
|
||||
- 这一题用模拟的方式就可以解出来。需要注意的是边界条件:比如二维数组为空,二维数组退化为一行或者一列,退化为一个元素。具体例子见测试用例。
|
||||
Reference in New Issue
Block a user