算法题—顺时针打印矩阵

简介: 算法题—顺时针打印矩阵

题目描述

将一个n阶矩阵顺时针打印,例如

# 二阶矩阵
1  2  
3  2
# 顺时针打印结果:
1 2 2 3
# 四阶矩阵
1  2  3  4
5  6  7  8
9  4  5  6
9  0  3  2
# 顺时针打印结果:
1 2 3 4 8 6 2 3 0 9 9 5 6 7 5 4

题目条件:

7 > n > 0

解题思路:

首先要搞懂顺时针的次序:向右 -> 向下 -> 向左 -> 向上

因为是二维数组,可以只用x和y来表示将要访问的遍历,但是想要顺时针进行遍历则需要准确的确定当前元素的具体位置以及将要下一步遍历的位置。可以使用距离上下左右的四个边距来表示,如图:

主要算法步骤:

int up = 0;
int down = array.length - 1;
int left = 0;
int right = array[0].length - 1;
List list;
while(1==1){
    // 从上边开始向右遍历(保持横轴不变)
    for (int col = left; col <= right; col++) {
        list.add(array[up][col]);
    }  
    up++;// 向下逼近
    if (up > down) break;// 判断是否越界
    // 从上向下开始遍历(保持纵轴不变)
    for (int row = up; row <= down; row++) {
        list.add(array[row][right]);
    }    
    right--;// 向左逼近
    if (left > right) break; // 判断是否越界
    // 从右向左开始遍历(保持横轴不变)
    for (int col = right; col >= left; col--) {
        list.add(array[down][col]);
    }
    down--;// 向上逼近   
    if (up > down) break; // 判断是否越界
    // 从下向上开始遍历(保持纵轴不变)
    for (int row = down; row >= up; row--) {
        list.add(array[row][left]);
    }
    left++; // 向右逼近  
    if (left > right) break; // 判断是否越界
}

全部代码:

public static ArrayList<Integer> printMatrix(int[][] matrix) {
    ArrayList<Integer> list = new ArrayList<>();
    if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
        return list;
    }
    int up = 0;
    int down = matrix.length - 1;
    int left = 0;
    int right = matrix[0].length - 1;
    while (true) {
        for (int col = left; col <= right; col++) {
            list.add(matrix[up][col]);
        }
        up++;
        if (up > down) {
            break;
        }
        for (int row = up; row <= down; row++) {
            list.add(matrix[row][right]);
        }
        right--;
        if (left > right) {
            break;
        }
        for (int col = right; col >= left; col--) {
            list.add(matrix[down][col]);
        }
        down--;
        if (up > down) {
            break;
        }
        for (int row = down; row >= up; row--) {
            list.add(matrix[row][left]);
        }
        left++;
        if (left > right) {
            break;
        }
    }
    return list;
}


相关文章
|
6月前
|
算法 测试技术 C++
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-48 算法训练 关联矩阵
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-48 算法训练 关联矩阵
66 0
|
6月前
|
算法 测试技术 C#
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
|
22天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
1月前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
26 4
|
1月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
101 0
|
3月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
51 6
|
5月前
|
机器学习/深度学习 数据采集 人工智能
算法金 | 协方差、方差、标准差、协方差矩阵
**摘要:** 本文介绍了统计学中的基础概念,包括方差、标准差、协方差及其矩阵。方差衡量数据的分散程度,标准差是方差的平方根,提供相同单位下的波动度量。协方差则分析两个变量的关联性,正负值表示正负相关。协方差矩阵扩展到多变量情况,展示多个变量间的关系。这些工具在金融、质量控制、机器学习等领域有广泛应用。文章通过实例和公式清晰解释了每个概念,并强调理解它们之间的关系对于数据分析和统计建模的重要性。
66 0
算法金 | 协方差、方差、标准差、协方差矩阵
|
6月前
|
算法 测试技术 编译器
【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项
题目描述 题目 在字符矩阵中查找给定字符串的所有匹配项 给定一个M×N字符矩阵,以及一个字符串S,找到在矩阵中所有可能的连续字符组成的S的次数。所谓的连续字符,是指一个字符可以和位于其上下左右,左上左下,右上右下8个方向的字符组成字符串。用回溯法求解。
96 1
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值