LeetCode54. 螺旋矩阵Ⅰ

题目描述

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例

image
image

提交的代码

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        //行数
        int m=matrix.length;
        //列数
        int n=matrix[0].length;
        //以行数和列数中的较小值除以2来确定需要转几次
        int minOne=Math.min(m,n);
        int loop=minOne/2;
        //每一圈的起始index
        int startIndex=0;
        //每一圈不需要处理的个数
        int offset=1;
        //定义结果List
        List<Integer> result=new ArrayList<Integer>(m*n);
        int i,j;
        //当前需要循环次数的备份
        int loopCopy=loop;
        while(loop>0){
            i=startIndex;
            j=startIndex;
            
            for(;j<n-offset;j++){
                result.add(matrix[i][j]);
            }
            for(;i<m-offset;i++){
                result.add(matrix[i][j]);
            }
            for(;j>=offset;j--){
                result.add(matrix[i][j]);
            }
            for(;i>=offset;i--){
                result.add(matrix[i][j]);
            }

            startIndex++;
            loop--;
            offset++;
        }
        //当minOne为偶数的时候,代表当前已经循环完毕,不存在剩余部分
        if(minOne%2==0){
            return result;
        }
        //当minOne为奇数的时候,代表还存在1*1,1*3,3*1这样的剩余部分
        int remainM=m-loopCopy*2;
        int remainN=n-loopCopy*2;
        if(remainM==remainN){
            //1*1形式的剩余部分
            result.add(matrix[startIndex][startIndex]);
        }else if(remainM>remainN){
            int indexM=startIndex;
            int indexN=startIndex;
            //m*1形式
            for(int y=0;y<remainM;y++,indexM++){
                result.add(matrix[indexM][indexN]);
            }
        }else{
            int indexM=startIndex;
            int indexN=startIndex;
            //1*n形式
            for(int y=0;y<remainN;y++,indexN++){
                result.add(matrix[indexM][indexN]);
            }
        }
        return result;
    }
}

思路

这个题的做法和螺旋矩阵Ⅱ的思想类似,最关键的还是遍历一个二维矩阵使用左闭右开的原则,唯一不同的是计算循环次数loop是根据当前矩阵长和宽相对较短的那一个来计算:int minOne=Math.min(matrix.length,matrix[0].length),loop=minOne/2;最后无法转圈的部分的起始startIndex=minOne/2,然后计算最终剩下的部分的形状矩阵循环遍历就可以解决。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值