【算法修炼】螺旋矩阵问题

一、54、螺旋矩阵(中等)

在这里插入图片描述
螺旋矩阵是很经典的题目,它不涉及算法,就是简单的模拟,但是细节很多,在面试时一紧张就容易写错。其实可以把整个求解过程拆分成4个部分就不容易搞混。

对于一个矩阵,我们可以规定它的左上角为(top, left) 右上角为(top, right) 左下角为(bottom, left) 右下角为(bottom right),left、top初始值为0,right初始值为列数,bottom初始值为行数,然后按照螺旋矩阵形成的顺序进行模拟:右下左上。

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
    	int rows = matrix.length;
    	int columns = matrix[0].length;
    	List<Integer> ans = new LinkedList<>();
    	if (matrix == null || rows == 0 || columns == 0) return ans;
    	int left = 0, right = columns - 1, top = 0, bottom = rows - 1;
    	while (left <= right && top <= bottom) {
    		// 先遍历top行
    		for (int column = left; column <= right; column++) {
    			ans.add(matrix[top][column]);
    		}
    		// 再遍历right列
    		for (int row = top + 1; row <= bottom; row++) {
    			ans.add(matrix[row][right]);
    		}
    		// 当left == right 或者 top == bottom,就成了一条线,不能走
    		if (left < right && top < bottom) {
    			for (int column = right - 1; column > left; column--) {
    				ans.add(matrix[bottom][column]);
    			}
    			for (int row = bottom; row > top; row--) {
    				ans.add(matrix[row][left]);
    			}
    		}
    		left++;
            top++;
    		right--;
    		bottom--;
    	}
    	return ans;
    }
}

二、螺旋矩阵(蓝桥杯)

在这里插入图片描述
和上面方法一样,模拟出矩阵

import java.io.*;
import java.util.*;

public class Main {
    static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) throws IOException {
    	int top = 0, left = 0, right = 29, bottom = 29;
    	int[][] matrix = new int[35][35];
    	int cur = 1;
    	while (left <= right && top <= bottom) {
    		// 记住遍历顺序:右下左上
        	for (int col = left; col <= right; col++) {
        		matrix[top][col] = cur++;
        	}
        	for (int row = top + 1; row <= bottom; row++) {
        		matrix[row][right] = cur++;
        	}
        	if (left < right && top < bottom) {
        		for (int col = right - 1; col > left; col--) {
        			matrix[bottom][col] = cur++;
        		}
        		for (int row = bottom; row > top; row--) {
        			matrix[row][left] = cur++;
        		}
        	}
        	left++;
        	top++;
        	right--;
        	bottom--;    		
    	}
    	System.out.println(matrix[19][19]);
    }
}

三、螺旋矩阵Ⅱ(中等)

在这里插入图片描述
同样也是上一题的方法

class Solution {
    public int[][] generateMatrix(int n) {
    	int[][] ans = new int[n][n];
    	int num = 1;
    	int top = 0, left = 0, right = n - 1, bottom = n - 1;
    	while (left <= right && top <= bottom) {
    		for (int col = left; col <= right; col++) {
    			ans[top][col] = num++;
    		}
    		for (int row = top + 1; row <= bottom; row++) {
    			ans[row][right] = num++;
    		}
    		if (left < right && top < bottom) {
    			for (int col = right - 1; col >= left; col--) {
    				ans[bottom][col] = num++;
    			}
    			for (int row = bottom - 1; row > top; row--) {
    				ans[row][left] = num++;
    			}
    		}
    		left++;
    		top++;
    		right--;
    		bottom--;
    	}
    	return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@u@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值