算法集合-二维数组
本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力
解题关键: 找出边界条件, 找出循环不变量
算法题目
题目59.螺旋矩阵II
给你一个正整数n ,生成一个包含 1 到n2所有元素,
且元素按顺时针顺序螺旋排列的n x n 正方形矩阵 matrix .
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
解题思路:
生成一个 n×n 空矩阵 mat,随后模拟整个向内环绕的填入过程:
假设初始每圈的初始点都是(x0,y0)
1. 从左至右填入上层元素, 依次为(x0,y0)到(xn,y0), 也就是y轴不动, n代表矩阵的长度
2. 从上到下填入右侧元素, 依次为(xn,y1)到(xn,yn), 注意这里的开始值是y(0+1)
3. 从右至左填入下层元素, 依次为(xn-1,yn)到(x0,yn), 注意这里开始值x(n-1)
4. 从下到上填入左侧元素, 依次为(x0,yn-1)到(x0,y1), 注意这里开始值y(n-1)
5. 转过一圈之后, x轴和y轴的下脚边想里缩一圈, 也就是(x1,y1)->(xn-1,yn-1)
6. 本逻辑中, 还需要一个数字记录数字的增长
解题思路图解:
func generateMatrix(n int) [][]int {
vector := make([][]int, n)
for i := range vector {
vector[i] = make([]int, n)
}
num := 1
x0, xn, y0, yn := 0, n-1, 0, n-1
for x0 <= xn && y0 <= yn{
for i:=x0; i<=xn; i++{
vector[y0][i] = num
num ++
}
for j:=y0+1; j<=yn; j++{
vector[j][xn] = num
num++
}
if x0 < xn && y0 <yn{
for i:=xn-1; i>=x0; i--{
vector[yn][i] = num
num ++
}
for j:=yn-1; j>y0; j--{
vector[j][x0] = num
num ++
}
}
x0++
y0++
xn--
yn--
}
return vector
}
// 这里注意下二维数据外层代表行, 内层代表列