螺旋遍历二维数组(java版)


前言

今天搁小灰的公众号号发了一个螺旋遍历的面试题,既然是面试题那咱们肯定要做一下啊。然后小灰的文章里面有一点小bug,就是没有去除中心位置重复遍历的情况,然后我加了一些代码。最后我写出来和小灰代码不一样,但是思路一样的,大家可以看一哈,然后希望大家可以不吝赐教看看哪里还需要改进。

一、什么是螺旋遍历数组?

说白了就是从外往里,一圈一圈的对数组进行遍历,那么我们一起来看一下具体的实现过程吧。
在这里插入图片描述

我的执行流程是这样的,你也可以逆时针执行,然后执行完外圈之后,再往里进一步,再执行一圈,直至完全遍历。大家注意看我的箭头长度,这里的箭头长度代表每条边遍历时的值。

二、实现代码

class Solution {
    
    
    public List<Integer> spiralOrder(int[][] matrix) {
    
    
        List<Integer> list = new ArrayList<>();
        //这里记住不要先设置变量,然后通过变量来判断长度是否为0,
        //因为如果为空的时候,是得不到宽度的,会报错
             
       if(matrix.length==0||matrix==null||matrix[0].length==0) {
    
    
            return list;
        }
         int len = matrix.length;
         int widlen = matrix[0].length;
         for(int i=0;i<(Math.min(len,widlen)+1)/2;i++){
    
    
            for(int j =i;j<widlen-i;j++){
    
                   
                list.add(matrix[i][j]);
            }
            for(int j=i+1;j<len-i;j++){
    
                   
                list.add(matrix[j][widlen-i-1]);
            }
            for(int j = widlen-i-2;j>=i;j--){
    
    
            //防止出现重复遍历的情况
                 if(list.size()==len*widlen){
    
    
                    break;
                }
                list.add(matrix[len-i-1][j]);
            }
            for(int j = len - i-2;j>i;j--){
    
    
            //防止出现重复遍历的情况
                if(list.size()==len*widlen){
    
    
                    break;
                }
                list.add(matrix[j][i]);
            }
            
        }
       return list;

总结

大家要是看不懂可以看一下《程序员小灰》的文章,虽然代码不一样,但是思路是一样的。也可以关注一下这个公众号真的很不错哦。

猜你喜欢

转载自blog.csdn.net/tan45du_yuan/article/details/108705843