剑指offer(C++)-JZ29:顺时针打印矩阵(算法-模拟)

简介: 剑指offer(C++)-JZ29:顺时针打印矩阵(算法-模拟)

题目描述:

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

数据范围:


0 <= matrix.length <= 100


0 <= matrix[i].length <= 100


示例:

输入:


[[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)模拟边界


      将矩阵看成多层包裹,先顺时针遍历最外面一层,再进入里面一层继续遍历,直到上下左右边界交错。


2)螺旋矩阵


      环带为一层遍历,边界为一层遍历。边界遍历又分为上下左右四个子部分。以“1+4”的组合遍历,完成螺旋矩阵。

测试代码:

1)模拟边界

class Solution {
public:
    vector<int> printMatrix(vector<vector<int>> matrix) {
        vector<int> result;
        int size = int(matrix.size());
        // 处理矩阵为空的情况
        if(size == 0) 
            return result;
        // 左边界
        int left = 0; 
        // 右边界
        int right = matrix[0].size() - 1; 
        // 上边界
        int up = 0; 
        // 下边界
        int down = size - 1; 
        // 循环直到边界交错
        while(left <= right && up <= down){ 
            // 上边界从左到右
            for(int i = left; i <= right; i++) 
                result.push_back(matrix[up][i]); 
            // 上边界向下一格,并判断上下边界位置是否交错
            up++; 
            if(up > down)
                break;
            // 右边界从上到下
            for(int i = up; i <= down; i++) 
                result.push_back(matrix[i][right]);
            // 右边界向左一格,并判断左右边界位置是否交错
            right--; 
            if(left > right)
                break;
            // 下边界从右到左
            for(int i = right; i >= left; i--) 
                result.push_back(matrix[down][i]);
            // 下边界向上一格,并判断上下边界位置是否交错
            down--; 
            if(up > down)
                break; 
            // 左边界从下到上
            for(int i = down; i >= up; i--) 
                result.push_back(matrix[i][left]);
            // 左边界向右一格,并判断左右边界位置是否交错
            left++; 
            if(left > right)
                break;
        }
        return result;
    }
};

2)螺旋矩阵

class Solution {
public:
    vector<int> printMatrix(vector<vector<int>> matrix) {       
        int row = int(matrix.size());
        int col = int(matrix[0].size());
        // 处理矩阵为空的情况
        if(row == 0 || col == 0) 
            return vector<int>(0);
        // 确认环数,环数与行列的最小值有关
        int minL = min(row, col);
        int ring = minL / 2 + minL % 2;
        // 螺旋矩阵遍历
        int count = row * col;
        int t = 0;
        vector<int> result(count);
        for(int k = 0; k < ring; ++k){
            // 当前环上边界遍历
            for(int p = k; p < col - k && t < count; ++p){
                result[t++] = matrix[k][p];
            }
            // 当前环右边界遍历
             for(int p = k + 1; p < row - k - 1 && t < count; ++p){
                result[t++] = matrix[p][col - k - 1];
            }
            // 当前环下边界遍历
             for(int p = col - k - 1; p >= k && t < count; --p){
                result[t++] = matrix[row - k - 1][p];
            }
            // 当前环左边界遍历
             for(int p = row - k - 2; p >= k + 1 && t < count; --p){
                result[t++] = matrix[p][k];
            }
        }
        return result;
    }
};


相关文章
|
1天前
|
存储 监控 算法
员工屏幕监控系统之 C++ 图像差分算法
在现代企业管理中,员工屏幕监控系统至关重要。本文探讨了其中常用的图像差分算法,该算法通过比较相邻两帧图像的像素差异,检测屏幕内容变化,如应用程序切换等。文中提供了C++实现代码,并介绍了其在实时监控、异常行为检测和数据压缩等方面的应用,展示了其实现简单、效率高的特点。
27 15
|
1天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
22 12
|
1月前
|
负载均衡 算法 安全
探秘:基于 C++ 的局域网电脑控制软件自适应指令分发算法
在现代企业信息化架构中,局域网电脑控制软件如同“指挥官”,通过自适应指令分发算法动态调整指令发送节奏与数据量,确保不同性能的终端设备高效运行。基于C++语言,利用套接字实现稳定连接和线程同步管理,结合实时状态反馈,优化指令分发策略,提升整体管控效率,保障网络稳定,助力数字化办公。
52 19
|
1月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
51 2
|
2月前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
1月前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
2月前
|
算法
|
2月前
|
算法 安全 C++
用 C++ 算法控制员工上网的软件,关键逻辑是啥?来深度解读下
在企业信息化管理中,控制员工上网的软件成为保障网络秩序与提升办公效率的关键工具。该软件基于C++语言,融合红黑树、令牌桶和滑动窗口等算法,实现网址精准过滤、流量均衡分配及异常连接监测。通过高效的数据结构与算法设计,确保企业网络资源优化配置与安全防护升级,同时尊重员工权益,助力企业数字化发展。
65 4
|
4月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
4月前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
69 4