剑指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();
        result.reserve(nRows * nCols);

        int startX = 0;
        int startY = 0;

        while (nRows > 2 * startX  && nCols > 2 * startY) {
            PrintNumbers(matrix, startX, startY, result);
            ++startX;
            ++startY;
        }
        return result;

    }
        void PrintNumbers(vector<vector<int>>& matrix, int startX, int startY, vector<int>& result) {
            assert(startX >= 0 && startY >= 0);
            int nRows = matrix.size();
            int nCols = matrix.at(0).size();

            int rowLen = nRows - 2 * startX; // 当前矩形的长度
            int colLen = nCols - 2 * startY; // 当前矩形的宽度

            int endX = startX + colLen - 1;  // endX - startX + 1 = colLen X为横坐标
            int endY = startY + rowLen - 1;  // endY - startY + 1 = rowLen Y为纵坐标

            // 1. 从左往右
            for (int i = startX; i <= endX; ++i) {
                result.push_back(matrix.at(startY).at(i));
            }

            // 2. 从上往下
            if (endY > startY) {
                for (int i = startY + 1; i <= endY; ++i) {
                    result.push_back(matrix.at(i).at(endX));
                }
            }

            // 3. 从右往左
            if (endX > startX && endY > startY) {
                for (int i = endX - 1; i >= startX; --i) {
                    result.push_back(matrix.at(endY).at(i));
                }
            }

            // 4. 从下往上
            if (endX > startX && endY > startY) {
                for (int i = endY - 1; i >= startY + 1; --i) {
                    result.push_back(matrix.at(i).at(startX));
                }
            }
        }
};

具体分析详见我的博文:螺旋矩阵

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

时间: 2024-11-03 21:24:57

剑指offer (20) 打印螺旋矩阵的相关文章

剑指offer (12) 打印1到最大的n位数

题目描述: 给定一个数字N,打印从1到最大的N位数 此题需要注意以下几点: 1. 涉及到大数问题,因为并没有限定 n的取值范围,所以需要采取 字符数组模拟大数运算 2. 打印数字时 需要忽略前置0 3. 我们始终 以n位数为整体,n位所有十进制数其实是 n位从0到9的全排列,可以采用递归解决 我们从 数组下标0开始 (对应于数字最高位),每一位都有0到9取值,然后设置下一位,递归的结束条件是 设置位到了数组的最末端 1 void PrintNum(char* num) 2 { 3 char* c

剑指OFFER之打印1到最大的N位数(九度OJ1515)

题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1到最大的N位数. 样例输入: 1 样例输出: 1 2 3 4 5 6 7 8 9 解题思路: 直接通过n快速指定比最大的那个数大1的数,10,100,1000,10000,100000.... 输出,就行了... 代码: #include <stdio.h> int main(void){ int

剑指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. 思路:一定要记住循环继续的条件是columns > start * 2,rows > start * 2; 一圈的打印分为四步: 第一步:无条件打印第一行,从左往右: 第二步:终止行号大于起始行号,打印最后一列,从上往下: 第

剑指offer顺时针打印矩阵python

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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. 思路 分别给行和列设置两个数字作为边界值,每一次循环之后,缩小边界. 代码 # -*- coding:utf-8 -*- class Solution: # matrix类型为二维列表,需要返回列表 def print

※剑指offer系列54:矩阵中的路径

这个题目用的是回溯法. 之前回溯法练得比较少,所以这个题还是需要重视. 回溯法是算法里学过的,就是从第一个可能得路径开始找,一直找到最后一个. 这个题目要注意一下几点: 1.从第一个开始找,如果第一个元素等于要寻找的字符串的第一个元素,就继续去寻找该元素的上下左右,看是否等于其下一个.一直匹配到最后一个元素. 2.如果这个元素的下一个在它的上下左右都找不到,就返回上一层,说明该元素也许走错了. 3.因为访问过得路径不能再次访问,因此要建立一个同样大小的bool型的变量记录该当前位置是否已经走过.

【剑指offer】打印1到最大的n位数

题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1,2,3一直到最大的3位数即999. 此题很容易误入陷阱! //第一次解法,不幸调入陷阱 void print(int n) { if (n<1) { printf("Invalid Input!\n"); return; } long maxNum=(int)pow(10.0,n);//如果n很大,不论int还是long都会溢出 for (int i=0; i<maxNum; i++) { pri

剑指Offer之打印从1到最大的n位数

基本思路 第一种方法:当我们只有对9999或者999或者99或9加1的时候,才会在第一个数字的基础上产生进位,而其他所有情况都不好在第一个数字上产生进位.因此当我们发现在加1的时候第一个数字产生了进位,则已经是最大的n位数,此时increment返回true,循环终止.代码如下: public class Print1ToMaxOfDigits { public static void main(String[] args) { Scanner sc = new Scanner(System.i

剑指offer:打印从1到最大的n位数

题目:输入数字n,按顺序从1打印到最大的n位十进制数.例如,输入3,则打印1, 2, 3, ..., 999 def printToMaxOfNDigits(n): """ 打印1, 2, ..., 99999(n个9) 可以从1开始然后用大数加法加到n个9,也可以使用递归方法实现 """ def helper(idx): # 递归出口就是设置完最后一位 if idx == n - 1: for j in range(n): if number[

剑指offer 65.回溯法 矩阵中的路径

题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子. 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子. 解题思路