顺时针打印矩阵-剑指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.

思路

  1. 整体是按着一圈一圈打印,需要找到循环继续的条件:columns > startX * 2并且rows > startY * 2
  2. 注意打印每圈的时候,四个边的打印循环起始条件

代码

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       if (matrix == null) {
	    	   return null;
	       }
	       ArrayList<Integer> list = new ArrayList<Integer>();
	       int rows = matrix.length;
	       int columns = matrix[0].length;
	       int start = 0;
	       while (rows > start * 2 && columns > start * 2) {
	    	   int endX = columns - 1 - start;
	    	   int endY = rows - 1 - start;
	    	   for (int i = start; i <= endX; i++) {
	    		  list.add(matrix[start][i]);
	    	   }
	    	   if (start < endY) {
	    		   for (int i = start + 1; i <= endY; i++) {
	    			   list.add(matrix[i][endX]);
	    		   }
	    	   }
	    	   if (start < endX && start < endY) {
	    		   for (int i = endX - 1; i >= start; i--) {
	    			   list.add(matrix[endY][i]);
	    		   }
	    	   }
	    	   if (start < endX && start < endY - 1) {
	    		   for (int i = endY - 1; i >= start + 1; i--) {
	    			   list.add(matrix[i][start]);
	    		   }
	    	   }
	    	   start++;
	       }
	       return list;
    }
}
时间: 2024-12-11 06:13:36

顺时针打印矩阵-剑指Offer的相关文章

顺时针打印矩阵—剑指offer

题目:输入一个矩阵,按照从里向外的顺序依次打印出每一个数字. 代码: 1 #include <cstdio> 2 3 void PrintMatrixInCircle(int** numbers, int columns, int rows, int start); 4 void printNumber(int number); 5 6 void PrintMatrixClockwisely(int** numbers, int columns, int rows) 7 { 8 if (num

从上往下打印二叉树-剑指Offer

从上往下打印二叉树 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路 数据结构:队列 将树按层遍历,先将根节点的左右子节点先后进入队列,然后再先后从队列取出,然后将取出的节点的左右子节点再入队列 循环进行,直到队列为空 代码 import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; /** public class TreeNode { int val = 0; Tree

按之字形顺序打印二叉树-剑指Offer

按之字形顺序打印二叉树 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路 根据题意,每行的节点的访问顺序是相反的,我们可以用两个栈来隔行存储,一个栈中根据“左结点->右结点”的顺序访问另一个栈的栈顶元素,而另一个栈根据“右子树->左子树”的顺序访问另一个栈的栈顶元素,直到两个栈都为空 代码 import java.util.ArrayList; import java.util.St

从尾到头打印链表-剑指Offer

从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值 输入描述 输入为链表的表头 输出描述 输出为需要打印的“新链表”的表头 思路 单向链表是从头到尾指向的,从尾到头打印符合“后进先出”,所以我们使用栈结构Stack 代码 import java.util.ArrayList; import java.util.Stack; public class Solution03 { public ArrayList<Integer> printListFromTailToHead(

从上往下打印二叉树(剑指offer)+队列的应用

从上往下打印二叉树 参与人数:1577时间限制:1秒空间限制:32768K 通过比例:25.53% 最佳记录:0 ms|0K(来自  dust347) 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题意:就是树的层次遍历.想象一下,从根结点依次往下,每行从左到右,这不就是是入队和出队的操作嘛! so...代码很容易吧. /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tr

《剑指offer》题解

有段时间准备找工作,囫囵吞枣地做了<剑指offer>提供的编程习题,下面是题解收集. 当初没写目录真是个坏习惯(-_-)||,自己写的东西都要到处找. 剑指Offer - 九度1524 - 复杂链表的复制 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先 剑指Offer - 九度1508 - 把字符串转换成整数 剑指Offer - 九度1504 - 把数组排成最小的数 剑指Offer - 九度1503 - 二叉搜索树与双向链表 剑指Offer - 九度1390 - 矩形覆盖 剑

剑指offer (20) 打印螺旋矩阵

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字 class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) { vector<int> result; int nRows = matrix.size(); if (nRows == 0) return result; int nCols = matrix.at(0).size()

剑指OFFER之顺时针打印矩阵(九度OJ1391)

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行包括两个整数m和n(1<=m,n<=1000):表示矩阵的维数为m行n列. 接下来的m行,每行包括n个整数,表示矩阵的元素,其中每个元素a的取值范围为(1&l

【剑指offer】顺时针打印矩阵

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上测试通过. 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 输入: 输入可能包含多个测试样例,对于每个测试案例,