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;
        }
    }
}


}