当前位置:网站首页>September 3, 2020: naked writing algorithm: loop matrix traversal.
September 3, 2020: naked writing algorithm: loop matrix traversal.
2020-11-06 21:50:00 【Daily problem of Fuda big frame constructor】
Fogo's answer 2020-09-03:
Method 1 : simulation , Bitmap mode .
Follow Method 2 equally , The difference is auxiliary matrix visited Save space with bitmaps .
Method 2 : simulation .
You can simulate the path of a spiral matrix . The initial position is the upper left corner of the matrix , The initial direction is to the right , When a path goes out of bounds or enters a previously visited location , Turn clockwise , Go to the next direction .
To determine whether a path enters a previously visited location, an auxiliary matrix of the same size as the input matrix is required visited, Each of these elements indicates whether the location has been accessed . When an element is accessed , take visited Set the element at the corresponding position in the to be accessed .
How to judge whether the path is over ? Because every element in the matrix is accessed once , So the length of the path is the number of elements in the matrix , When the length of the path reaches the number of elements in the matrix, it is a complete path , Return the path .
Complexity analysis
Time complexity :O(mn), among m and n The number of rows and columns of the input matrix . Every element in the matrix is accessed once .
Spatial complexity :O(mn). You need to create a size of m×n Matrix visited Record whether each location has been visited .
Method 3 : Layer by layer simulation
You can think of a matrix as layers , First output the outermost element , Second, output the sub outer elements , Until the innermost element is output .
Define the order of a matrix k The distance from the layer to the nearest boundary is k All the vertices of . for example , The outermost elements of the matrix in the figure below are all the first 1 layer , The sub outer elements are the first 2 layer , The rest of the elements are the first 3 layer .
Complexity analysis
Time complexity :O(mn), among m and n The number of rows and columns of the input matrix . Every element in the matrix is accessed once .
Spatial complexity :O(1). In addition to the output array , Space complexity is a constant .
The code to use golang To write , as follows :
package test37_spiralorder
import (
"fmt"
"testing"
)
//https://leetcode-cn.com/problems/spiral-matrix/solution/luo-xuan-ju-zhen-by-leetcode-solution/
//go test -v -test.run TestSpiralOrder
func TestSpiralOrder(t *testing.T) {
const N = 3
matrix := make([][]int, N)
for i := 0; i < N; i++ {
matrix[i] = make([]int, N)
for j := 0; j < N; j++ {
matrix[i][j] = i*N + j + 1
}
}
fmt.Println(matrix)
ret := spiralOrder1(matrix)
fmt.Println(ret, " Method 1 : simulation , Bitmap ")
ret = spiralOrder2(matrix)
fmt.Println(ret, " Method 2 : simulation ")
ret = spiralOrder3(matrix)
fmt.Println(ret, " Method 3 : Layer by layer simulation ")
}
// Method 1 : simulation , Bitmap
func spiralOrder1(matrix [][]int) []int {
if len(matrix) == 0 || len(matrix[0]) == 0 {
return []int{}
}
rows, columns := len(matrix), len(matrix[0])
visited := make([]byte, (rows*columns+7)/8)
var (
total = rows * columns
order = make([]int, total)
row, column = 0, 0
directions = [][]int{[]int{0, 1}, []int{1, 0}, []int{0, -1}, []int{-1, 0}}
directionIndex = 0
)
for i := 0; i < total; i++ {
order[i] = matrix[row][column]
SetBitMapValue(visited, row*columns+column, true)
nextRow, nextColumn := row+directions[directionIndex][0], column+directions[directionIndex][1]
if nextRow < 0 ||
nextRow >= rows ||
nextColumn < 0 ||
nextColumn >= columns ||
GetBitMapValue(visited, nextRow*columns+nextColumn) {
directionIndex = (directionIndex + 1) % 4
}
row += directions[directionIndex][0]
column += directions[directionIndex][1]
}
return order
}
// Method 2 : simulation
func spiralOrder2(matrix [][]int) []int {
if len(matrix) == 0 || len(matrix[0]) == 0 {
return []int{}
}
rows, columns := len(matrix), len(matrix[0])
visited := make([][]bool, rows)
for i := 0; i < rows; i++ {
visited[i] = make([]bool, columns)
}
var (
total = rows * columns
order = make([]int, total)
row, column = 0, 0
directions = [][]int{[]int{0, 1}, []int{1, 0}, []int{0, -1}, []int{-1, 0}}
directionIndex = 0
)
for i := 0; i < total; i++ {
order[i] = matrix[row][column]
visited[row][column] = true
nextRow, nextColumn := row+directions[directionIndex][0], column+directions[directionIndex][1]
if nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[nextRow][nextColumn] {
directionIndex = (directionIndex + 1) % 4
}
row += directions[directionIndex][0]
column += directions[directionIndex][1]
}
return order
}
// Method 3 : Layer by layer simulation
func spiralOrder3(matrix [][]int) []int {
if len(matrix) == 0 || len(matrix[0]) == 0 {
return []int{}
}
var (
rows, columns = len(matrix), len(matrix[0])
order = make([]int, rows*columns)
index = 0
left, right, top, bottom = 0, columns - 1, 0, rows - 1
)
for left <= right && top <= bottom {
for column := left; column <= right; column++ {
order[index] = matrix[top][column]
index++
}
for row := top + 1; row <= bottom; row++ {
order[index] = matrix[row][right]
index++
}
if left < right && top < bottom {
for column := right - 1; column > left; column-- {
order[index] = matrix[bottom][column]
index++
}
for row := bottom; row > top; row-- {
order[index] = matrix[row][left]
index++
}
}
left++
right--
top++
bottom--
}
return order
}
// Get bitmap No index The value of the element
func GetBitMapValue(data []byte, index int) bool {
return data[index/8]&(1<<(index%8)) != 0
}
// Set bitmap No index The value of the element
func SetBitMapValue(data []byte, index int, v bool) {
if v {
data[index/8] |= 1 << (index % 8)
} else {
data[index/8] &= ^(1 << (index % 8))
}
}
knock go test -v -test.run TestSpiralOrder command , give the result as follows :

版权声明
本文为[Daily problem of Fuda big frame constructor]所创,转载请带上原文链接,感谢
边栏推荐
- Zhou Jie: database system of East China Normal University
- GitHub: the foundation of the front end
- Erd-online free online database modeling tool
- MRAM高速缓存的组成
- The memorandum model of behavior model
- All the way, I was forced to talk about C code debugging skills and remote debugging
- 2020-08-14:数据任务的执行引擎用的哪些?
- How much disk space does a new empty file take?
- Take you to learn the new methods in Es5
- Axios learning notes (2): easy to understand the use of XHR and how to package simple Axios
猜你喜欢

image operating system windows cannot be used on this platform

Basic usage of Vue codemirror: search function, code folding function, get editor value and verify in time

Novice guidance and event management system in game development

What kind of music do you need to make for a complete game?

Cloudquery v1.2.0 release
![What grammar is it? ]](/img/3b/00bc81122d330c9d59909994e61027.jpg)
What grammar is it? ]

Markdown tricks

2020-08-30:裸写算法:二叉树两个节点的最近公共祖先。

What are the highlights of Huawei mate 40 series with HMS?

实验一
随机推荐
What the hell is fastthreadlocal? The existence of ThreadLocal!!
打工人好物——磨炼钢铁意志就要这样高效的电脑
An article will take you to understand CSS3 fillet knowledge
Exclusive interview of guests at | 2020 PostgreSQL Asia Conference: Wang Tao
Cloudquery v1.2.0 release
Take you to learn the new methods in Es5
Es create a new index database and copy the old index library, practice pro test effective!
ES中删除索引的mapping字段时应该考虑的点
To Lianyun analysis: why is IPFs / filecoin mining so difficult?
ES6 learning notes (3): teach you to use js object-oriented thinking to realize the function of adding, deleting, modifying and checking tab column
A concise tutorial for Nacos, ribbon and feign
Pn8162 20W PD fast charging chip, PD fast charging charger scheme
window系统 本机查找端口号占用方法
An article taught you to download cool dog music using Python web crawler
Introduction to the development of small game cloud
#JVM 类加载机制
ORA-02292: 违反完整约束条件 (MIDBJDEV2.SYS_C0020757) - 已找到子记录
How to play sortable JS vuedraggable to realize nested drag function of forms
CloudQuery V1.2.0 版本发布
Exclusive interview with Alibaba cloud database for 2020 PostgreSQL Asia Conference: Zeng Wenjing