[leetcode]Spiral Matrix

本文介绍了一种螺旋矩阵遍历算法,该算法可以按螺旋顺序返回矩阵中的所有元素。算法使用了一个visit数组来标记已访问过的元素,并从(0,0)开始逐圈扫描。此方法的时间复杂度为O(m*n),空间复杂度也为O(m*n)。

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

新博文地址:[leetcode]Spiral Matrix

Spiral Matrix

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example,
Given the following matrix:

[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]

 这道题是《剑指offer》上的例题,上面的解法很简单,但是我没用,我的算法更简单,而且也是O(m*n)的复杂度,但是需要O(m*n)的空间,当然,也可以不开额外的空间,直接修改原数组。

算法太简单了:

主要就是维护一个visit数组,来标记这个元素是否已经访问过,每圈都是从(0,0)(1,1)这样的(n,n)点开始扫描的,因此startLine表示扫描轮数,startLine <= min(rowCount,columnCount) / 2

不罗嗦了,直接看代码吧。

public List<Integer> spiralOrder(int[][] matrix) {
		List<Integer> list = new ArrayList<Integer>();
		int height = matrix.length;
		if(height == 0) return list;
		int width = matrix[0].length;
		if(width == 1){
			for(int i = 0 ; i < height; list.add(matrix[i][0]),i++);
			return list;
		}
		boolean[][] visited = new boolean[height][width];
		int startLine = 0;
		for(; startLine <= Math.min(height, width) / 2; startLine++){
			for(int i = 0; i < width; i++){
				if(!visited[startLine][i]){
					addToList(matrix, startLine, i, list, visited);
				}
			}
			for(int i = 0 ; i < height; i++){
				if(!visited[i][width - 1 - startLine]){
					addToList(matrix, i,width - 1- startLine, list, visited);
				}
			}
			
			for(int i = width - 1; i >= 0; i--){
				if(!visited[height - 1 - startLine][i]){
					addToList(matrix, height - 1 - startLine, i, list, visited);
				}
			}
			for(int i = height - 1; i >= 0 ; i--){
				if(!visited[i][startLine]){
					addToList(matrix, i,startLine, list, visited);
				}
			}
		}
		return list;
    }
	
	private void addToList(int[][] matrix,int row,int column,List<Integer> list,boolean visited[][]){
		list.add(matrix[row][column]);
		visited[row][column] = true;
	}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值