力扣刷题记录五:59、螺旋矩阵 Ⅱ

这篇文章讲解了如何使用C++, Java和Python实现一个生成包含1到n²元素,按顺时针螺旋排列的n×n矩阵的算法,重点在于理解左闭右开区间的应用。适合初学者掌握矩阵填充技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录力扣刷题第五题:

本文包含C++题解和Java、Python题解

题目描述如下

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
如图:
方法如图
来源:LeetCode

思路:

这题思路倒是挺好想的,就是像图片中描述的一样,绕圈循环。但是代码实现有一点点难度,要注意每次变量i,j循环的区间是左闭右开区间,这样才能正确的拐弯。代码实现如下:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
    	vector< vector<int> > ans(n, vector<int>(n, 0));
    	int offset = 1; //设置偏移量
    	int loops = n/2; //设置绕圈数
    	int startx = 0, starty = 0;
    	//设置每次绕圈的起始位置(x, y)
    	int cnt = 1; //矩阵中元素的值
    	while(loops--) {
    		int i = startx, j = starty;
    		//设置变量i,j的起始位置
    		
    		for(j = starty; j < starty + n - offset; ++j) {
    			ans[i][j] = cnt++;
    		}
    		//注意这个循环中没有赋值到此行最后一个没被赋值的元素,即左闭右开区间
    		
    		for(; i < startx + n - offset; ++i) {
    			ans[i][j] = cnt++;
    		}
    		//依旧是左闭右开区间,但是把上一个没闭上的点赋值了,这样才能保证不重不漏
    		
    		for(; j > starty; --j) {
    			ans[i][j] = cnt++;
    		}
    		//这里开始向左折,同样是左闭右开区间,且右界为起始值
    		
    		for(; i > startx; --i) {
    			ans[i][j] = cnt++;
    		}
    		//这里开始向上折,左闭右开
			//转完了一个圈		
			startx++;
			starty++;
			offset += 2;//由于起始和结尾都要扣去一格,所以减二
		}
		//如果n是奇数,那么其中心元素不算一圈,不会被循环到,这里要额外进行赋值
		if(n % 2 == 1) {
			ans[n / 2][n / 2] = cnt;
		}
		return ans;
    }
};

自己动手写一下吧!是不是还挺容易晕的?其实只要注意别把左闭右开区间搞错了就能写对了。


下面放上用Java和Python的做法

Java

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] ans = new int[n][n];
        int offset = 1, cnt = 1;
        int startx = 0, starty = 0;
        int loops = n / 2;
        for(; loops > 0; loops--) {
            int i = startx, j = starty;
            for(j = starty; j < starty + n - offset; ++j) {
                ans[i][j] = cnt++;
            }
            for(i = startx; i < startx + n - offset; ++i) {
                ans[i][j] = cnt++;
            }
            for(; j > starty; --j) {
                ans[i][j] = cnt++;
            }
            for(; i > startx; --i) {
                ans[i][j] = cnt++;
            }
            startx++; starty++;
            offset += 2;
        }
        if(n % 2 == 1) {
            ans[n / 2][n / 2] = cnt;
        }
        return ans;
    }
}

Python

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        ans = [[0 for a in range(0, n)] for b in range(0, n)]
        startx = 0
        starty = 0
        loops = n // 2
        offset = 1
        cnt = 1
        while loops > 0 :
            i = startx
            j = starty
            for j in range(starty, starty + n - offset):
                ans[i][j] = cnt
                cnt += 1
            j += 1
            for i in range(startx, startx + n - offset):
                ans[i][j] = cnt
                cnt += 1
            i += 1
            c = j
            for j in range(c, starty, -1):
                ans[i][j] = cnt
                cnt += 1
            j -= 1
            d = i
            for i in range(d, startx, -1):
                ans[i][j] = cnt
                cnt += 1
            startx += 1
            starty += 1
            offset += 2
            loops -= 1
        if n % 2 == 1:
            ans[n // 2][n // 2] = cnt
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值