栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode.54.螺旋矩阵

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode.54.螺旋矩阵

LeetCode.54.螺旋矩阵

难度:medium

 

 Java:

简单的模拟法,从外围转圈向内部并且不断缩小边界;

未通过版本:

//未通过
class Solution {
    public List spiralOrder(int[][] matrix) {
        List list = new ArrayList<>();
        int rows = matrix.length;
        int columns = matrix[0].length;
        int up = 0;
        int down = rows - 1;
        int left = 0;
        int right = columns - 1;
        while (true) {
            for (int i = left; i <= right - 1; i++) {
                list.add(matrix[up][i]);
            }
            if (++up > down) {
                break;
            }
            for (int i = up - 1; i <= down - 1; i++) {
                list.add(matrix[i][right]);
            }
            if(--right < left) {
                break;
            }
            for (int i = right + 1; i >= left + 1; i--) {
                list.add(matrix[down][i]);
            }
            if (--down < up) {
                break;
            }
            for (int i = down + 1; i >= up; i--) {
                list.add(matrix[i][left]);
            }
            if (++left > right) {
                break;
            }
        }
        return list;
    }
}


 

通过版本:

通过判定边界,最后跳出;

class Solution {
    public List spiralOrder(int[][] matrix) {
        List list = new ArrayList<>();
        int rows = matrix.length;
        int columns = matrix[0].length;
        int up = 0;
        int down = rows - 1;
        int left = 0;
        int right = columns - 1;
        while (true) {
            for (int i = left; i <= right; i++) {
                list.add(matrix[up][i]);
            }
            if (++up > down) {
                break;
            }
            for (int i = up; i <= down; i++) {
                list.add(matrix[i][right]);
            }
            if(--right < left) {
                break;
            }
            for (int i = right; i >= left; i--) {
                list.add(matrix[down][i]);
            }
            if (--down < up) {
                break;
            }
            for (int i = down; i >= up; i--) {
                list.add(matrix[i][left]);
            }
            if (++left > right) {
                break;
            }
        }
        return list;
    }
}

通过判定是否将rows*columns个数存入数组,来判定是否跳出; 

class Solution {
    public List spiralOrder(int[][] matrix) {
        List list = new ArrayList<>();
        int rows = matrix.length;
        int columns = matrix[0].length;
        int up = 0;
        int down = rows - 1;
        int left = 0;
        int right = columns - 1;
        //矩阵一共有多少个元素
        int num = rows * columns;
        for (int element = 1; element <= num;) {
            for (int i = left; i <= right; i++) {
                list.add(matrix[up][i]);
                element++;
            }
            ++up;
            
            for (int i = up; i <= down; i++) {
                list.add(matrix[i][right]);
                element++;
            }
           --right;
            
            for (int i = right; i >= left; i--) {
                list.add(matrix[down][i]);
                element++;
            }
            --down;
            
            for (int i = down; i >= up; i--) {
                list.add(matrix[i][left]);
                element++;
            }
            ++left;
            
        }
        return list;
    }
}

复杂度分析:

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1),除了返回数组外,空间复杂度是常数
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/680924.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号