LeetCode刷题034 顺时针打印矩阵

该文章提供了一个Java代码实现,用于按顺时针方向打印矩阵中的元素。代码包括一个主方法spiralOrder和辅助方法printMatrix,递归地处理不同大小的矩阵,特别考虑了边界条件如1x1、1xn和nx1的矩阵。

剑指 Offer 29. 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
题解

注意判断1 × 1、1 × n 、n × 1 的矩阵

Code
class Solution {
    public int[] spiralOrder(int[][] matrix) {
        ArrayList<Integer> list = new ArrayList<>();
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
            return new int[0];
        printMatrix(matrix, list, 0, matrix.length - 1, 0, matrix[0].length - 1);
        int[] result = new int[list.size()];
        int index = 0;
        for(Integer i : list)
            result[index++] = i;
        return result;
    }

    public static void printMatrix(int[][] matrix, ArrayList<Integer> list,
                                         int rowBg, int rowEd, int colBg, int colEd){
        if(rowBg > rowEd || colBg > colEd){
            return;
        }
        for(int i = colBg; i <= colEd; i++)
            list.add(matrix[rowBg][i]);
        for(int i = rowBg + 1; i <= rowEd; i++)
            list.add(matrix[i][colEd]);
        if(rowBg != rowEd){
            for(int i = colEd - 1; i >= colBg; i--)
                list.add(matrix[rowEd][i]);
        }
        if(colBg != colEd){
            for(int i = rowEd - 1; i > rowBg; i--)
                list.add(matrix[i][colBg]);
        }
        printMatrix(matrix, list, ++rowBg, --rowEd, ++colBg, --colEd);
    } 
}
### LeetCode C++ 教程和技巧 #### 基础准备 为了高效地使用C++在LeetCode,了解一些基本概念和技术是非常重要的。这不仅限于掌握编程语言本身,还包括理解如何利用特定的数据结构和算法来解决问。 #### 数据处理与数组操作 对于涉及数组的操作问,如移除重复项或旋转矩阵等问,可以采用直接遍历的方法或是通过调整元素位置的方式来实现目标功能。例如,在解决去除排序数组中的重复项这一经典目时,可以通过比较当前元素与其前驱元素是否相同来进行筛选[^1]: ```cpp class Solution { public: int removeDuplicates(vector<int>& nums) { int cnt = 0; for(int i = 0; i < nums.size(); i++) { if(!i || nums[i] != nums[i - 1]) nums[cnt++] = nums[i]; } return cnt; } }; ``` 此方法的时间复杂度为O(n),其中n表示输入列表长度;空间复杂度则保持常量级别O(1),因为只用了有限数量的额外变量存储计数值`cnt`以及用于迭代循环控制的索引变量`i`。 #### 使用双指针技术优化解决方案 当面对需要查找两个数相加等于给定值的情况(即两数之和),或者更复杂的多数字求和场景下,应用双指针策略能够显著提高效率。具体来说就是设置一对指向序列两端的游标,并依据它们所指示元素总和大小关系动态移动其中一个直至找到满足条件的结果为止[^3]: ```cpp class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { int left = 0, right = numbers.size() - 1; while (left < right) { int sum = numbers[left] + numbers[right]; if (sum > target) { right--; } else if (sum < target) { left++; } else { return {left + 1, right + 1}; } } return {-1, -1}; } }; ``` 这种方法特别适用于已经排好序的整型数组,因为它能在线性时间内完成搜索过程而无需借助哈希表等辅助数据结构。 #### 复杂变换下的矩阵操作 针对像图像旋转变换这样的几何学挑战,则可能涉及到行列互换及镜像反射等多种转换手段相结合的方式。下面给出了一种先做水平翻转再沿主对角线交换对应位置上的像素值得到顺时针90度旋转效果的具体实现方案[^4]: ```cpp void rotate(vector<vector<int>>& matrix) { int n = matrix.size(); // Step 1: Horizontal flip for(int i=0; i<n/2; ++i){ for(int j=0; j<n; ++j){ swap(matrix[i][j], matrix[n-i-1][j]); } } // Step 2: Transpose along main diagonal for(int i=0; i<n; ++i){ for(int j=0; j<i; ++j){ swap(matrix[i][j], matrix[j][i]); } } } ``` 上述代码片段展示了怎样分步执行两次不同的映射操作最终达到预期目的的同时也保证了整体性能处于最优状态——时间复杂度同样维持在O(N^2),这里N代表方阵边长尺寸。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值