From c154e483df4db7fbde419b9807b50349d4c9ddd4 Mon Sep 17 00:00:00 2001 From: chefyuan Date: Thu, 18 Mar 2021 10:05:13 +0800 Subject: [PATCH] erfen --- gif-algorithm/二分查找/新建文本文档.txt | 0 gif-algorithm/二分查找及其变种 | 1 + gif-algorithm/数组篇/leetcode54螺旋矩阵.md | 81 +++++++++++ gif-algorithm/数组篇/leetcode59螺旋矩阵2.md | 143 ++++++++++++++++++++ 4 files changed, 225 insertions(+) delete mode 100644 gif-algorithm/二分查找/新建文本文档.txt create mode 160000 gif-algorithm/二分查找及其变种 create mode 100644 gif-algorithm/数组篇/leetcode54螺旋矩阵.md create mode 100644 gif-algorithm/数组篇/leetcode59螺旋矩阵2.md diff --git a/gif-algorithm/二分查找/新建文本文档.txt b/gif-algorithm/二分查找/新建文本文档.txt deleted file mode 100644 index e69de29..0000000 diff --git a/gif-algorithm/二分查找及其变种 b/gif-algorithm/二分查找及其变种 new file mode 160000 index 0000000..8ebe8b2 --- /dev/null +++ b/gif-algorithm/二分查找及其变种 @@ -0,0 +1 @@ +Subproject commit 8ebe8b2c2c30767c1999ef4f513a3e0adf8b294d diff --git a/gif-algorithm/数组篇/leetcode54螺旋矩阵.md b/gif-algorithm/数组篇/leetcode54螺旋矩阵.md new file mode 100644 index 0000000..11e5a87 --- /dev/null +++ b/gif-algorithm/数组篇/leetcode54螺旋矩阵.md @@ -0,0 +1,81 @@ +### leetcode 54 螺旋矩阵 + +题目描述 + +*给定一个包含 m* x n个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 + + + +示例一 + +> 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] +> 输出:[1,2,3,6,9,8,7,4,5] + +示例二 + +> 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] +> 输出:[1,2,3,4,8,12,11,10,9,5,6,7] + + + +这个题目很细非常细,思路很容易想到,但是要是完全实现也不是特别容易,我们一起分析下这个题目,我们可以这样理解,我们像剥洋葱似的一步步的剥掉外皮,直到遍历结束,见下图。 + + + +*![螺旋矩阵](https://pic.leetcode-cn.com/1615813563-uUiWlF-file_1615813563382)* + + + +题目很容易理解,但是要想完全执行出来,也是不容易的,因为这里面的细节太多了,我们需要认真仔细的考虑边界。 + + + +我们也要考虑重复遍历的情况即什么时候跳出循环。刚才我们通过箭头知道了我们元素的遍历顺序,这个题目也就完成了一大半了,下面我们来讨论一下什么时候跳出循环,见下图。 + + + +注:这里需要注意的是,框框代表的是每个边界。 + +![](https://img-blog.csdnimg.cn/20210318095839543.gif) + +题目代码: + +```java +class Solution { + public List spiralOrder(int[][] matrix) { + + List arr = new ArrayList<>(); + int left = 0, right = matrix[0].length-1; + int top = 0, down = matrix.length-1; + + while (true) { + for (int i = left; i <= right; ++i) { + arr.add(matrix[top][i]); + } + top++; + if (top > down) break; + for (int i = top; i <= down; ++i) { + arr.add(matrix[i][right]); + } + right--; + if (left > right) break; + for (int i = right; i >= left; --i) { + arr.add(matrix[down][i]); + } + down--; + if (top > down) break; + for (int i = down; i >= top; --i) { + arr.add(matrix[i][left]); + } + left++; + if (left > right) break; + + } + return arr; + } +} + +``` + + + diff --git a/gif-algorithm/数组篇/leetcode59螺旋矩阵2.md b/gif-algorithm/数组篇/leetcode59螺旋矩阵2.md new file mode 100644 index 0000000..08303b6 --- /dev/null +++ b/gif-algorithm/数组篇/leetcode59螺旋矩阵2.md @@ -0,0 +1,143 @@ + + +### leetcode 59 螺旋矩阵 2 + +给你一个正整数 `n` ,生成一个包含 `1` 到 `n2` 所有元素,且元素按顺时针顺序螺旋排列的 `n x n` 正方形矩阵 `matrix` 。 + +**示例 1:** + +> 输入:n = 3 +> 输出:[[1,2,3],[8,9,4],[7,6,5]] + +**示例 2:** + +> 输入:n = 1 +> 输出:[[1]] + +其实我们只要做过了螺旋矩阵 第一题,这个题目我们完全可以一下搞定,几乎没有进行更改,我们先来看下 **leetcode 54** 题的解析。 + + + +### leetcode 54 螺旋矩阵 + +题目描述 + +*给定一个包含 m* x n个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 + + + +示例一 + +> 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] +> 输出:[1,2,3,6,9,8,7,4,5] + +示例二 + +> 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] +> 输出:[1,2,3,4,8,12,11,10,9,5,6,7] + + + +这个题目很细非常细,思路很容易想到,但是要是完全实现也不是特别容易,我们一起分析下这个题目,我们可以这样理解,我们像剥洋葱似的一步步的剥掉外皮,直到遍历结束,见下图。 + + + +*![螺旋矩阵](https://pic.leetcode-cn.com/1615813563-uUiWlF-file_1615813563382)* + + + +题目很容易理解,但是要想完全执行出来,也是不容易的,因为这里面的细节太多了,我们需要认真仔细的考虑边界。 + + + +我们也要考虑重复遍历的情况即什么时候跳出循环。刚才我们通过箭头知道了我们元素的遍历顺序,这个题目也就完成了一大半了,下面我们来讨论一下什么时候跳出循环,见下图。 + + + +注:这里需要注意的是,框框代表的是每个边界。 + +![](https://img-blog.csdnimg.cn/20210318095839543.gif) + +题目代码: + +```java +class Solution { + public List spiralOrder(int[][] matrix) { + + List arr = new ArrayList<>(); + int left = 0, right = matrix[0].length-1; + int top = 0, down = matrix.length-1; + + while (true) { + for (int i = left; i <= right; ++i) { + arr.add(matrix[top][i]); + } + top++; + if (top > down) break; + for (int i = top; i <= down; ++i) { + arr.add(matrix[i][right]); + } + right--; + if (left > right) break; + for (int i = right; i >= left; --i) { + arr.add(matrix[down][i]); + } + down--; + if (top > down) break; + for (int i = down; i >= top; --i) { + arr.add(matrix[i][left]); + } + left++; + if (left > right) break; + + } + return arr; + } +} + +``` + + + +我们仅仅是将 54 反过来了,往螺旋矩阵里面插值,下面我们直接看代码吧,大家可以也可以对其改进,大家可以思考一下,如果修改能够让代码更简洁! + +```java +class Solution { + public int[][] generateMatrix(int n) { + + int[][] arr = new int[n][n]; + int left = 0; + int right = n-1; + int top = 0; + int buttom = n-1; + int num = 1; + int numsize = n*n; + while (true) { + for (int i = left; i <= right; ++i) { + arr[top][i] = num++; + } + top++; + if (num > numsize) break; + for (int i = top; i <= buttom; ++i) { + arr[i][right] = num++; + + } + right--; + if (num > numsize) break; + for (int i = right; i >= left; --i) { + arr[buttom][i] = num++; + } + buttom--; + if (num > numsize) break; + for (int i = buttom; i >= top; --i) { + arr[i][left] = num++; + } + left++; + if (num > numsize) break; + + } + return arr; + } +} +``` +