zoukankan      html  css  js  c++  java
  • 剑指offer-顺时针打印矩阵

    题目:顺时针打印矩阵

    题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.

    思路:这个题不难,但是比较繁琐,先来看看我的思路

    我是先确定4个角的点

    mStart:行开始的点,mEnd,行结束的点

    nStart:列开始的点,nEnd:列结束的点

    如这个矩阵

    ------>
    1 2 3
    4 5 6 7 8 9 2 5 7

    我是按上面这样的顺序转的

    代码:代码看上去比较多但是有不少是重复的,很好理解

     1 import java.util.ArrayList;
     2 public class Solution {
     3     public ArrayList<Integer> printMatrix(int [][] matrix) {
     4         ArrayList<Integer>list=new ArrayList<>();
     5         int m=matrix.length;
     6         int n=matrix[0].length;
     7         int mStart=0;int mEnd=m-1;
     8         int nStart=0;int nEnd=n-1;
     9           if(mStart==mEnd&&nStart==nEnd){
              //说明矩阵只有一个元素
    10 list.add(matrix[mStart][nStart]); 11 } 12 if(mStart==mEnd&&nStart<nEnd){
              //说明此时矩阵为一列
    13 for(int i=nStart;i<=nEnd;i++) 14 list.add(matrix[mStart][i]); 15 } 16 if(nStart==nEnd&&mStart<mEnd){
              //说明此时为一行
    17 for(int i=mStart;i<=mEnd;i++) 18 list.add(matrix[i][nStart]); 19 } 20 21 while(mStart<mEnd&&nStart<nEnd){
            //按我上图颜色区域去遍历
    22 for(int i=nStart;i<nEnd;i++){ 23 list.add(matrix[mStart][i]); 24 } 25 for(int i=mStart;i<mEnd;i++){ 26 list.add(matrix[i][nEnd]); 27 } 28 for(int i=nEnd;i>nStart;i--){ 29 list.add(matrix[mEnd][i]); 30 } 31 for(int i=mEnd;i>mStart;i--){ 32 list.add(matrix[i][nStart]); 33 } 34 //将行,列开始,结束位置都减1 35 mStart++; 36 mEnd--; 37 nStart++; 38 nEnd--; 39 if(mStart==mEnd&&nStart==nEnd){ 40 list.add(matrix[mStart][nStart]); 41 } 42 if(mStart==mEnd&&nStart<nEnd){ 43 for(int i=nStart;i<=nEnd;i++) 44 list.add(matrix[mStart][i]); 45 } 46 if(nStart==nEnd&&mStart<mEnd){ 47 for(int i=mStart;i<=mEnd;i++) 48 list.add(matrix[i][nStart]); 49 } 50 51 } 52 return list; 53 } 54 }

    学习一下按照圈数来控制循环次数的解法;

     1  
     2 import java.util.ArrayList;
     3 public class Solution {
     4     public ArrayList<Integer> printMatrix(int [][] array) {
     5         ArrayList<Integer> result = new ArrayList<Integer> ();
     6         if(array.length==0) return result;
     7         int n = array.length,m = array[0].length;
     8         if(m==0) return result;
     9         int layers = (Math.min(n,m)-1)/2+1;//这个是层数
    10         for(int i=0;i<layers;i++){
    11             for(int k = i;k<m-i;k++) result.add(array[i][k]);//左至右
    12             for(int j=i+1;j<n-i;j++) result.add(array[j][m-i-1]);//右上至右下
    13             for(int k=m-i-2;(k>=i)&&(n-i-1!=i);k--) result.add(array[n-i-1][k]);//右至左
    14             for(int j=n-i-2;(j>i)&&(m-i-1!=i);j--) result.add(array[j][i]);//左下至左上
    15         }
    16         return result;       
    17     }
    18 }
  • 相关阅读:
    [LeetCode] Next Greater Element I
    [LeetCode] Fizz Buzz
    [LeetCode] Reverse String
    [LeetCode] Average of Levels in Binary Tree
    [LeetCode] Encode and Decode TinyURL
    推荐一个计算机视觉图书:python计算机视觉编程
    leetcode 9 Palindrome Number 回文数
    ios swift模仿qq登陆界面,xml布局
    leetcode 26 Remove Duplicates from Sorted Array
    leetcode 88 Merge Sorted Array
  • 原文地址:https://www.cnblogs.com/pathjh/p/9144813.html
Copyright © 2011-2022 走看看