59. 螺旋矩阵II
题目描述
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
解题思路
好像就是en做 写出来了 但是很长,就是按照题目的意思进行模拟(迭代),每次迭代填入最外层的一圈
#![allow(unused)] fn main() { struct Solution {} impl Solution { pub fn generate_matrix(n: i32) -> Vec<Vec<i32>> { let n = n as usize; let mut v = vec![vec![0; n]; n]; // idx,idx 左上角的坐标, n 这一行的所有元素个数-1 右上角坐标idx,idx+n pub fn f(v: &mut Vec<Vec<i32>>, idx: usize, n: usize, start: i32) -> i32 { if n == 0 { v[idx][idx] = start; return start + 1 } let mut cur = start; for j in 0..n { v[idx][idx+j] = cur ; cur += 1; } for i in 0..n { v[idx+i][idx+n] = cur ; cur += 1; } for j in 0..n { v[idx+n][idx+n-j] = cur ; cur += 1; } for i in 0..n { v[idx+n-i][idx] = cur ; cur += 1; } cur } let mut start = 1; let mut x = n as isize - 1; let mut i = 0; while x >= 0 { start = f(&mut v, i, x as usize, start); i += 1; x -= 2; } v } } }
学习感想
本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。
坚持循环不变量原则
确实,定义一定要非常明确,明确了定义之后就牢牢地实现这个定义
可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,如果不按照固定规则来遍历,那就是一进循环深似海,从此offer是路人。
然后好像就是我这种模拟的做法
#![allow(unused)] fn main() { struct Solution {} impl Solution { pub fn generate_matrix(n: i32) -> Vec<Vec<i32>> { let mut m: Vec<Vec<i32>> = vec![vec![0i32; n as usize]; n as usize]; let mut current: i32 = 1i32; for i in 0usize .. (n as usize + 1usize) / 2usize { Self::f(&mut m, i, &mut current); } m } pub fn f(m: &mut Vec<Vec<i32>>, start: usize, start_num: &mut i32) { let width: usize = m.len() - start * 2usize - 1usize; if width == 0 { m[start][start] = *start_num; return; } for i in 0..width { m[start][start + i] = *start_num; *start_num += 1i32; } for j in 0..width { m[start + j][start + width] = *start_num; *start_num += 1i32; } for i in 0..width { m[start + width][start + width - i] = *start_num; *start_num += 1i32; } for j in 0..width { m[start + width - j][start] = *start_num; *start_num += 1i32; } } } }