力扣labuladong一刷day19天花式遍历

力扣labuladong一刷day19天花式遍历

文章目录

一、48. 旋转图像

题目链接:https://leetcode.cn/problems/rotate-image/

思路:把矩阵向右旋转90度,要求原地操作,这里借鉴了把一个字符串里所有单词顺序给翻转的思路,单词顺序翻转其实是,先翻转整个字符串,然后再翻转每一个单词即可完成,而不是按照空格把每一个单词分隔开再拼回去。

把矩阵沿着左上角和右下角这条对对角线翻转,然后再每一行横向翻转即可得到顺时针旋转90度。

java 复制代码
class Solution {
   public void rotate(int[][] matrix) {
        int n = matrix.length;
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        for (int[] nums : matrix) {
            int i = 0, j = nums.length-1;
            while (i < j) {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
                i++;
                j--;
            }
        }
    }
}

二、54. 螺旋矩阵

题目链接:https://leetcode.cn/problems/spiral-matrix/

思路:每次读取一条边,然后每遍历一条边就调整边界。

java 复制代码
class Solution {
  List<Integer> spiralOrder(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        int upper_bound = 0, lower_bound = m - 1;
        int left_bound = 0, right_bound = n - 1;
        List<Integer> res = new LinkedList<>();
        // res.size() == m * n 则遍历完整个数组
        while (res.size() < m * n) {
            if (upper_bound <= lower_bound) {
                // 在顶部从左向右遍历
                for (int j = left_bound; j <= right_bound; j++) {
                    res.add(matrix[upper_bound][j]);
                }
                // 上边界下移
                upper_bound++;
            }

            if (left_bound <= right_bound) {
                // 在右侧从上向下遍历
                for (int i = upper_bound; i <= lower_bound; i++) {
                    res.add(matrix[i][right_bound]);
                }
                // 右边界左移
                right_bound--;
            }

            if (upper_bound <= lower_bound) {
                // 在底部从右向左遍历
                for (int j = right_bound; j >= left_bound; j--) {
                    res.add(matrix[lower_bound][j]);
                }
                // 下边界上移
                lower_bound--;
            }

            if (left_bound <= right_bound) {
                // 在左侧从下向上遍历
                for (int i = lower_bound; i >= upper_bound; i--) {
                    res.add(matrix[i][left_bound]);
                }
                // 左边界右移
                left_bound++;
            }
        }
        return res;
    }
}

三、59. 螺旋矩阵 II

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/

思路:正方形的螺旋矩阵可以按照四条边遍历,每次只遍历左闭右开,正好每次遍历一个圈。

java 复制代码
class Solution {
     public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        int k = 1;
        for (int i = 0; i < n / 2; i++) {

            for (int j = i; j < n-i-1; j++) {
                matrix[i][j] = k++;
            }

            for (int j = i; j < n-i-1; j++) {
                matrix[j][n-i-1] = k++;
            }

            for (int j = n-i-1; j > i; j--) {
                matrix[n-i-1][j] = k++;
            }

            for (int j = n-i-1; j > i; j--) {
                matrix[j][i] = k++;
            }
        }
        if (n % 2 == 0) return matrix;
        matrix[n/2][n/2] = k;
        return matrix;
    }
}
相关推荐
aramae6 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
荆棘鸟智能7 小时前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
INGNIGHT10 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
2401_8390805411 小时前
C++常见八股
数据结构·c++·算法
青山是哪个青山11 小时前
LeetCode 188:买卖股票的最佳时机 IV
算法
mikuyyds11 小时前
geo-toolbox 插件算法解析:RUSLE 与 MUSLE 的工程化落地
算法·rust·gis
Tisfy11 小时前
LeetCode 3498.字符串的反转度:一次遍历
leetcode·字符串·题解·遍历
a1879272183111 小时前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历
syagain_zsx12 小时前
算法基础篇 · 03 枚举(C++ 题解)
c++·算法·二进制·枚举
weixin_3077791312 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab