Skip to content

Commit 24dc6a6

Browse files
EdgeAshazl397985856
authored andcommitted
feat: daily 2019-07-29 spiral matrix (azl397985856#72)
* feat: longest harmonious subsequence * daily: Longest Harmonious Subsequence, option 1 * pref: make code universal. * pref: get better answer. * alternative solutions. * Update 2019-06-20.md * Update 2019-06-20.md * feat: date 2019.06.17 * fix: add tag. * Update 2019-06-17.md * Update 2019-06-17.md * feat: 9.palindrome-number(2019-07-25) * feat: daily 2019-06-06(daily-temperatures) * pref: optimize code. * pref: one code for each solution. * feat: spiral matrix * fix: time & space complexity. * fix: narrative optimize. * style: prefer unordered list & drawio * Update 2019-07-29.md * Update 2019-07-29.md * Update 2019-07-29.md * Update 2019-07-29.md
1 parent 99d339e commit 24dc6a6

File tree

4 files changed

+151
-0
lines changed

4 files changed

+151
-0
lines changed

Diff for: assets/drawio/54.spiral-matrix.drawio

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile modified="2019-08-01T11:38:39.440Z" host="www.draw.io" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36" etag="q-Byi9CPJF0PKpvNLpEZ" version="11.0.8" type="google"><diagram id="Bgq8IZrC7bgJlUmAquKk" name="Page-1">5Zhdb5swFIZ/DZeN+E64TNOm07RKkapq69XkggPWADPjNGS/fsfBhgBO0qZJJ61VpOLX9jE+zznGtuHMsuqOoSK5pxFODduMKsO5MWzbcm3bED8z2tTKxPRrIWYkko1a4YH8wVI0pboiES47DTmlKSdFVwxpnuOQdzTEGF13my1p2h21QDEeCA8hSofqdxLxRM7CHrf6F0ziRI1s+UFdkyHVWM6kTFBE1zuSc2s4M0Ypr5+yaoZT4Tzll7rffE9t82IM5/w1Hab3y/Dx7uu3JHn8udgs5uvV0/OVpPOC0pWcsGH7Kdi7XlIwC2/NN9IV/u8VVRVX5RbUFBq4blG1lfAUi/+WcTs3rmfGZAYKygqQ8uey2LYw7UOVzqFKV73dM1MjDRXvkAX/UOX4UOXkNWMHjQUI4Oax9YbV+BdA1S5WpuyOt22OK6EnPEtBsOCx5Iz+wjOaUgZKTnMsaJA07UkoJXEOxRQvhYUXzDiBgJ5KOSNRJAa5XieE44cChWLENaQvaIyu8giLiDGblxIGcLU36qwmlmERwDTDnG2giexgezL8Zf6r4rpNJseVWrKTSI5KGyQTOG5MtzEODzLM3xDyribke77vekHnp71YDNuZzx34gxoKfQgXE/dMPao4RWUphykwIzBDzMRQJI9Bts/EwO0ymGgYOBoG/qUQeGdGsOvG/Th0/mcoIuDFntwDdwYEntlFYI2HDMYaBE27szPwPx2Dfhro8sDWrUUXy4Pxp2egywNPg2ByKQSTT4egWeoVAk0aWDoGF0uD4DgDnEdTsZuHUig8TMKu22HubPND+H3kjQMlPIFwZY5M01HKTSXZ1KXNbmmhPsBKrAivTdqeLD7tVLWmREFZqt8cR4NTRQ8PzI6uWIiP7805YjHmx9oNcR/JKKUxnCJOXrqvq0MsR1hQsj0YNNHkdaKp/72qZyk77Z5O+nYmXTv97V/thYGdbbw1kz49BNVx8z0x+Fr0/wqV39uDQJafxmpgKPA+Fpb1/8NyrW4+OH4wOhGXYx41dWlgumuG/wxYs2KppHBOXAn7hqzgg5fC4QHZc0dlQRgSfTPEGakG+N5/XRECR/Htfc+Fxe7uq3/6pjmX14tWcKbN7LhLyrWGOynH1ISc+/adFBTbq8IadXvh6tz+BQ==</diagram></mxfile>

Diff for: assets/problems/54.spiral-matrix.jpg

17.8 KB
Loading

Diff for: daily/2019-07-29.md

+144
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
# 毎日一题 - 54.Spiral Matrix
2+
3+
## 信息卡片
4+
5+
- 时间:2019-07-29
6+
- 题目链接:https://leetcode.com/problems/spiral-matrix/
7+
- tag:`Array` `Matrix`
8+
9+
## 题目描述
10+
11+
```
12+
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
13+
14+
Example 1:
15+
16+
Input:
17+
[
18+
[ 1, 2, 3 ],
19+
[ 4, 5, 6 ],
20+
[ 7, 8, 9 ]
21+
]
22+
Output: [1,2,3,6,9,8,7,4,5]
23+
Example 2:
24+
25+
Input:
26+
[
27+
[1, 2, 3, 4],
28+
[5, 6, 7, 8],
29+
[9,10,11,12]
30+
]
31+
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
32+
```
33+
34+
## 参考答案
35+
36+
1. 剥洋葱,row->col->row->col 为一次;
37+
2. row->col、col->row 的切换都伴随读取的初始位置的变化;
38+
3. 结束条件是row头>row尾或者col顶>col底
39+
40+
![剥洋葱](../assets/problems/54.spiral-matrix.jpg)
41+
42+
时间复杂度O(m*n), 空间复杂度O(1)
43+
44+
参考JavaScript代码:
45+
46+
```js
47+
/**
48+
* @param {number[][]} matrix
49+
* @return {number[]}
50+
*/
51+
var spiralOrder = function(matrix) {
52+
if(matrix.length === 0) return [];
53+
let rowT = 0; // 行顶
54+
let rowB = matrix.length - 1; // 行底
55+
let colL = 0; // 列左
56+
let colR = matrix[0].length - 1; // 列右
57+
let result = [];
58+
// 顺序是行、列、行、列;每次切换,读取的初始位置都会变化1(+/- 1)
59+
while (colL <= colR && rowT <= rowB) {
60+
for (let a = colL; a <= colR; a++) {
61+
result.push(matrix[rowT][a]);
62+
}
63+
rowT++;
64+
for (let b = rowT; b <= rowB; b++) {
65+
result.push(matrix[b][colR]);
66+
}
67+
colR--;
68+
for (let c = colR; c >= colL && rowB >= rowT; c--) {
69+
result.push(matrix[rowB][c]);
70+
}
71+
rowB--;
72+
for (let d = rowB; d >= rowT && colR >= colL; d--) {
73+
result.push(matrix[d][colL]);
74+
}
75+
colL++;
76+
}
77+
return result;
78+
};
79+
```
80+
81+
代码只有一个for循环的方式,操作方向
82+
例如
83+
> 1 2 3 4 5
84+
> 6 7 8 9 10
85+
> 11 12 13 14 15
86+
>
87+
> 对上面矩阵遍历时的操作
88+
>
89+
> 向右5次(算上从左侧第一次进入)
90+
> 向下2次
91+
> 向左4次
92+
> 向上1次
93+
> 向右3次
94+
> 向下0次 -- 结束
95+
96+
方向有四个,right、down、left、up
97+
四个方向又分两类,水平(right,left)和垂直(down,up)
98+
而在两类方向上的移动最值是 水平n, 垂直m;
99+
在遍历过程中,根据`方向切换`来减小n/m从而缩小两类方向的移动最值直到结束
100+
四个方向可以用二维数组来表示[ [0, 1], [1, 0], [0, -1], [-1, 0] ]
101+
两类方向各自的初始最大值是[n, m-1]
102+
当 n == 0 || m == 0 表示元素已经全部遍历完
103+
104+
这种写法省去了代码中的for循环,但是while循环次数却增多了;复杂度没有变化
105+
时间复杂度O(m*n), 空间复杂度O(1)
106+
107+
参考JavaScript代码:
108+
109+
```js
110+
/**
111+
* @param {number[][]} matrix
112+
* @return {number[]}
113+
* 一个for循环,但while变多了
114+
*/
115+
var spiralOrder = function(matrix) {
116+
if(matrix.length === 0) return [];
117+
let m = matrix.length;
118+
let n = matrix[0].length;
119+
let result = [];
120+
const dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]] // 控制方向的数组
121+
// 元素坐标row,col;
122+
let row = 0;
123+
let col = -1;
124+
let steps = [n, m-1]
125+
let dir = 0; // 初始方向
126+
while(steps[dir%2]) {
127+
for(let i = 0; i < steps[dir%2]; i++) {
128+
// 方向的改变的效果,row/col能增能减
129+
row += dirs[dir][0]; col += dirs[dir][1];
130+
result.push(matrix[row][col])
131+
}
132+
steps[dir%2]--; // 移动极值缩小
133+
dir = (dir+1)%4; // 方向改变
134+
}
135+
return result;
136+
};
137+
```
138+
139+
## 优秀解答
140+
141+
> 暂缺
142+
143+
## 参考
144+
- @stellari [A concise C++ implementation based on Directions](https://leetcode.com/problems/spiral-matrix/discuss/20573/A-concise-C%2B%2B-implementation-based-on-Directions)

Diff for: daily/README.md

+6
Original file line numberDiff line numberDiff line change
@@ -173,3 +173,9 @@ tag:`Math`
173173
tag:`数据压缩`
174174

175175
时间: 2019-07-26
176+
177+
### [54.Spiral Matrix](./2019-07-29.md)
178+
179+
tag:`Array` `Matrix`
180+
181+
时间: 2019-07-29

0 commit comments

Comments
 (0)