遍历螺旋矩阵的技巧

摘要:
intup=0;intdown=matrix.length-1;intleft=0;intright=matrix[0].length-1;inti,j;intcount=0;//可以定义一个countwhile{//当总操作数小于n*m时继续遍历//处理第一横行,最上面那一个//for循环起始条件,i从最左边一直到最右边for{//此时matrix[up][i]为所有第一横行的元素count++;}up++;//第一横行下移//处理最右边那一行,竖行//i从最上面开始到最下面,因为up已经++,所以不会重复读取for{matrix[i][right];//表示所有右竖行元素count++;}right--;//最右边的竖行左移//以下同上for{matrix[down][i];count++;}down--;for{matrix[i][left];count++;}left++;}↑就螺旋遍历了整个数组例题:54.螺旋矩阵难度中等361给定一个包含mxn个元素的矩阵,请按照顺时针螺旋顺序,返回矩阵中的所有元素。

遇见过挺多次,总结了一下方法,以后写的时候就不需要再慢慢想怎么模拟了

螺旋遍历数组方法:

按层模拟,从最外层开始

每次从第一个元素开始,→ ↓ ← ↑ 为一轮,通过进行操作的总次数判断是否结束

定义up,down,left,right表示 → ↓ ← ↑ 对应行的边界

up = 0; down = matrix.length-1 ; left = 0 ; right = matrix[0].length-1

通过每次for循环读取完一行,就将这一行的位置往内收缩一层(例如up++),当再次读取到这里时就不会读取已经读取过的值。

int up = 0;
        int down = matrix.length-1;
        int left = 0;
        int right = matrix[0].length-1;
        int i,j;
		int count = 0; //可以定义一个count
        while( count<= n*m ){	//当总操作数小于n*m(数组长和宽)时继续遍历
            //处理第一横行,最上面那一个
            //for循环起始条件,i从最左边 一直到最右边
            for(i=left;i<=right && ans.size() < row * col ;i++){	
                //此时matrix[up][i]为所有第一横行的元素
                count++;
            }
            up++;	//第一横行下移
            //处理最右边那一行,竖行
            //i从最上面开始到最下面,因为up已经++ ,所以不会重复读取
            for(i=up; i <= down  && ans.size() < row * col ; i++ ){
                matrix[i][right];//表示所有右竖行元素
                count++;
            } 
            right--;	//最右边的竖行左移
            //以下同上
            for(i=right; i >= left  && ans.size() < row * col ; i-- ){
                matrix[down][i];
                count++;
            }
            down--;
            for(i=down; i >= up  && ans.size() < row * col ; i-- ){
                matrix[i][left];
                count++;
            }
            left++;
        }

↑ 就螺旋遍历了整个数组


例题:

54. 螺旋矩阵

难度中等361

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

示例 2:

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

59. 螺旋矩阵 II

难度中等179

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3
输出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

第一题:

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> ans = new ArrayList<>();
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
            return ans;
        int row = matrix.length;
        int col = matrix[0].length;
        int up = 0;
        int down = matrix.length-1;
        int left = 0;
        int right = matrix[0].length-1;
        int i,j;
        while( ans.size() < row * col ){
            for(i=left;i<=right && ans.size() < row * col ;i++){
                ans.add(matrix[up][i]);
            }
            up++;
            for(i=up; i <= down  && ans.size() < row * col ; i++ ){
                ans.add(matrix[i][right]);
            } 
            right--;
            for(i=right; i >= left  && ans.size() < row * col ; i-- ){
                ans.add(matrix[down][i]);
            }
            down--;
            for(i=down; i >= up  && ans.size() < row * col ; i-- ){
                ans.add(matrix[i][left]);
            }
            left++;
        }
        return ans;
    }
}

第二题:

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        int step = 1;
        int count = 0;
        int up = 0;
        int down = n-1;
        int left = 0;
        int right = n-1;
        int i;
        while(step <= n*n){
            for(i=left ; i<=right && step <= n*n ;i++){
                matrix[up][i] = step;
                step++;
            }
            up++;
            for(i=up ; i <= down && step <= n*n ;i++){
                matrix[i][right] = step;
                step++;
            }
            right--;
            for(i=right;i>=left && step <= n*n ; i--){
                matrix[down][i] = step;
                step++;
            }
            down--;
            for(i=down;i>=up && step <= n*n ;i--){
                matrix[i][left] = step;
                step++;
            }
            left++;
        }
        return matrix;
    }
}

免责声明:文章转载自《遍历螺旋矩阵的技巧》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Angular2组件开发—模板语法(五)MVC原生解析引擎aspx页面,智能提示好像还依赖于web.config中compilation节点下的assemblies列表下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

计算机基础第三章:寄存器&amp;amp;内存(Registers&amp;amp;RAM)

寄存器&内存(Registers&RAM) 前言 前面学习了逻辑门和ALU,想要制作一个“CPU”我们还需要学习内存,因为CPU所运算 数据的读写都离不开内存。 一.内存单位 学习内存首先我们要了解存储单位 1TB(太字节)=1024GB(千兆字节) 1GB=1024MB(兆字节) 1MB=1024KB(千字节) 1KB=1024byte(...

R数据挖掘 第二篇:基于距离评估数据的相似性和相异性

聚类分析根据对象之间的相异程度,把对象分成多个簇,簇是数据对象的集合,聚类分析使得同一个簇中的对象相似,而与其他簇中的对象相异。相似性和相异性(dissimilarity)是根据数据对象的属性值评估的,通常涉及到距离度量。相似性(similarity)和相异性(dissimilarity)是负相关的,统称为临近性(proximity)。 在聚类分析中,聚类...

说说高斯过程回归

说说高斯过程回归作者介绍:新浪微博ID @妖僧老冯, 9月将赴南京大学(直博生),方向是机器学习与数据挖掘 编者:小便和作者打过几次交道,一直以为是他是已“修成正果”的某某博士,便“毕恭毕敬”地去邀请他写篇牛文。细聊之后才得知小伙子原来是90后,9月份才博士入学。这篇文章对GP进行了深度科普,数学公式是有一些的,但耐心读读,都不是问题的。高斯过程是机器学习...

OptimalSolution(5)--数组和矩阵问题(1)简单

  一、转圈打印矩阵   题目:给定一个整型矩阵matrix,按照转圈的方式打印它。   要求:额外空间复杂度为O(1) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 打印结果为:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10   思路:矩阵分圈处理问题。用...

【高性能并行计算】——第四课 线性代数方程组的并行求解

    LU分解在本质上是高斯消元法的一种表达形式。实质上是将A通过初等行变换变成一个上三角矩阵,其变换矩阵就是一个单位下三角矩阵。这正是所谓的杜尔里特算法(Doolittle algorithm):从下至上地对矩阵A做初等行变换,将对角线左下方的元素变成零,然后再证明这些行变换的效果等同于左乘一系列单位下三角矩阵,这一系列单位下三角矩阵的乘积的逆就是L...

NVIDIA深度学习Tensor Core性能解析(上)

NVIDIA深度学习Tensor Core性能解析(上) 本篇将通过多项测试来考验Volta架构,利用各种深度学习框架来了解Tensor Core的性能。 很多时候,深度学习这样的新领域会让人难以理解。从框架到模型,再到API和库,AI硬件的许多部分都是高度定制化的,因而被行业接受的公开基准测试工具很少也就不足为奇。随着ImageNet和一些衍生模型(Al...