Skip to content

daily 2019-07-29 spiral matrix #72

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 30 commits into from
Aug 1, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
52ef06f
feat: longest harmonious subsequence
EdgeAsh Jul 19, 2019
71661e7
daily: Longest Harmonious Subsequence, option 1
EdgeAsh Jul 21, 2019
37e4967
pref: make code universal.
EdgeAsh Jul 24, 2019
9079d13
pref: get better answer.
EdgeAsh Jul 24, 2019
1b89b87
alternative solutions.
EdgeAsh Jul 24, 2019
49a7611
Merge remote-tracking branch 'upstream/master'
EdgeAsh Jul 25, 2019
5fc24ca
Update 2019-06-20.md
azl397985856 Jul 25, 2019
2f9cdf6
Update 2019-06-20.md
azl397985856 Jul 25, 2019
2f4c4b3
Merge branch 'master' of https://github.com/baiban0312/leetcode
EdgeAsh Jul 25, 2019
0670807
feat: date 2019.06.17
EdgeAsh Jul 25, 2019
b491e4d
fix: add tag.
EdgeAsh Jul 26, 2019
5448258
merge upstream
EdgeAsh Jul 26, 2019
16799a2
Update 2019-06-17.md
azl397985856 Jul 26, 2019
e5b0206
Update 2019-06-17.md
azl397985856 Jul 26, 2019
c69bb05
feat: 9.palindrome-number(2019-07-25)
EdgeAsh Jul 26, 2019
0d8afff
Merge remote-tracking branch 'upstream/master'
EdgeAsh Jul 26, 2019
c0a195f
feat: daily 2019-06-06(daily-temperatures)
EdgeAsh Jul 29, 2019
482bc3d
Merge remote-tracking branch 'upstream/master'
EdgeAsh Jul 30, 2019
071c0ea
pref: optimize code.
EdgeAsh Jul 30, 2019
bef300d
pref: one code for each solution.
EdgeAsh Jul 30, 2019
e1dc2b3
Merge remote-tracking branch 'upstream/master'
EdgeAsh Jul 31, 2019
43cb8ec
Merge remote-tracking branch 'upstream/master'
EdgeAsh Aug 1, 2019
44e5332
feat: spiral matrix
EdgeAsh Aug 1, 2019
cf73bab
fix: time & space complexity.
EdgeAsh Aug 1, 2019
b602a0e
fix: narrative optimize.
EdgeAsh Aug 1, 2019
72ea3df
style: prefer unordered list & drawio
EdgeAsh Aug 1, 2019
16d80a6
Update 2019-07-29.md
EdgeAsh Aug 1, 2019
31944a1
Update 2019-07-29.md
EdgeAsh Aug 1, 2019
52cb42c
Update 2019-07-29.md
EdgeAsh Aug 1, 2019
fb4fc49
Update 2019-07-29.md
EdgeAsh Aug 1, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions assets/drawio/54.spiral-matrix.drawio
Original file line number Diff line number Diff line change
@@ -0,0 +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>
Binary file added assets/problems/54.spiral-matrix.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
144 changes: 144 additions & 0 deletions daily/2019-07-29.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
# 毎日一题 - 54.Spiral Matrix

## 信息卡片

- 时间:2019-07-29
- 题目链接:https://leetcode.com/problems/spiral-matrix/
- tag:`Array` `Matrix`

## 题目描述

```
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

Example 1:

Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:

Input:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
```

## 参考答案

1. 剥洋葱,row->col->row->col 为一次;
2. row->col、col->row 的切换都伴随读取的初始位置的变化;
3. 结束条件是row头>row尾或者col顶>col底

![剥洋葱](../assets/problems/54.spiral-matrix.jpg)

时间复杂度O(m*n), 空间复杂度O(1)

参考JavaScript代码:

```js
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function(matrix) {
if(matrix.length === 0) return [];
let rowT = 0; // 行顶
let rowB = matrix.length - 1; // 行底
let colL = 0; // 列左
let colR = matrix[0].length - 1; // 列右
let result = [];
// 顺序是行、列、行、列;每次切换,读取的初始位置都会变化1(+/- 1)
while (colL <= colR && rowT <= rowB) {
for (let a = colL; a <= colR; a++) {
result.push(matrix[rowT][a]);
}
rowT++;
for (let b = rowT; b <= rowB; b++) {
result.push(matrix[b][colR]);
}
colR--;
for (let c = colR; c >= colL && rowB >= rowT; c--) {
result.push(matrix[rowB][c]);
}
rowB--;
for (let d = rowB; d >= rowT && colR >= colL; d--) {
result.push(matrix[d][colL]);
}
colL++;
}
return result;
};
```

代码只有一个for循环的方式,操作方向
例如
> 1 2 3 4 5
> 6 7 8 9 10
> 11 12 13 14 15
>
> 对上面矩阵遍历时的操作
>
> 向右5次(算上从左侧第一次进入)
> 向下2次
> 向左4次
> 向上1次
> 向右3次
> 向下0次 -- 结束

方向有四个,right、down、left、up
四个方向又分两类,水平(right,left)和垂直(down,up)
而在两类方向上的移动最值是 水平n, 垂直m;
在遍历过程中,根据`方向切换`来减小n/m从而缩小两类方向的移动最值直到结束
四个方向可以用二维数组来表示[ [0, 1], [1, 0], [0, -1], [-1, 0] ]
两类方向各自的初始最大值是[n, m-1]
当 n == 0 || m == 0 表示元素已经全部遍历完

这种写法省去了代码中的for循环,但是while循环次数却增多了;复杂度没有变化
时间复杂度O(m*n), 空间复杂度O(1)

参考JavaScript代码:

```js
/**
* @param {number[][]} matrix
* @return {number[]}
* 一个for循环,但while变多了
*/
var spiralOrder = function(matrix) {
if(matrix.length === 0) return [];
let m = matrix.length;
let n = matrix[0].length;
let result = [];
const dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]] // 控制方向的数组
// 元素坐标row,col;
let row = 0;
let col = -1;
let steps = [n, m-1]
let dir = 0; // 初始方向
while(steps[dir%2]) {
for(let i = 0; i < steps[dir%2]; i++) {
// 方向的改变的效果,row/col能增能减
row += dirs[dir][0]; col += dirs[dir][1];
result.push(matrix[row][col])
}
steps[dir%2]--; // 移动极值缩小
dir = (dir+1)%4; // 方向改变
}
return result;
};
```

## 优秀解答

> 暂缺

## 参考
- @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)
6 changes: 6 additions & 0 deletions daily/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -173,3 +173,9 @@ tag:`Math`
tag:`数据压缩`

时间: 2019-07-26

### [54.Spiral Matrix](./2019-07-29.md)

tag:`Array` `Matrix`

时间: 2019-07-29