From 746823474481b45af116a3fdb4c852c716d91326 Mon Sep 17 00:00:00 2001 From: YDZ Date: Mon, 26 Aug 2019 22:53:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20problem=20498?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../498. Diagonal Traverse.go | 140 ++++++++++++++++++ .../498. Diagonal Traverse_test.go | 67 +++++++++ Algorithms/0498. Diagonal Traverse/README.md | 39 +++++ 3 files changed, 246 insertions(+) create mode 100644 Algorithms/0498. Diagonal Traverse/498. Diagonal Traverse.go create mode 100644 Algorithms/0498. Diagonal Traverse/498. Diagonal Traverse_test.go create mode 100755 Algorithms/0498. Diagonal Traverse/README.md diff --git a/Algorithms/0498. Diagonal Traverse/498. Diagonal Traverse.go b/Algorithms/0498. Diagonal Traverse/498. Diagonal Traverse.go new file mode 100644 index 00000000..4af24378 --- /dev/null +++ b/Algorithms/0498. Diagonal Traverse/498. Diagonal Traverse.go @@ -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]) + } +} diff --git a/Algorithms/0498. Diagonal Traverse/498. Diagonal Traverse_test.go b/Algorithms/0498. Diagonal Traverse/498. Diagonal Traverse_test.go new file mode 100644 index 00000000..b78ae3ff --- /dev/null +++ b/Algorithms/0498. Diagonal Traverse/498. Diagonal Traverse_test.go @@ -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") +} diff --git a/Algorithms/0498. Diagonal Traverse/README.md b/Algorithms/0498. Diagonal Traverse/README.md new file mode 100755 index 00000000..bc12d88b --- /dev/null +++ b/Algorithms/0498. Diagonal Traverse/README.md @@ -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: + +![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/12/diagonal_traverse.png) + +**Note:** + +The total number of elements of the given matrix will not exceed 10,000. + + +## 题目大意 + +给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。 + +![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/12/diagonal_traverse.png) + +说明: 给定矩阵中的元素总数不会超过 100000 。 + +## 解题思路 + +- 给出一个二维数组,要求按照如图的方式遍历整个数组。 +- 这一题用模拟的方式就可以解出来。需要注意的是边界条件:比如二维数组为空,二维数组退化为一行或者一列,退化为一个元素。具体例子见测试用例。