算法题(矩阵)

一、题目

1、螺旋矩阵(LC 54)

2、旋转图像(LC 48)

3、搜索二维矩阵II(LC 240)

二、题解

1、螺旋矩阵(LC 54)

(1)分析

创建四个参数,表示左、右、上、下的边界,循环遍历的顺序是:从左往右、从上往下、从右往左、从下往上。用一个数组来存储每次遍历取得的值,每进行一次遍历,需要判断是否要进行下一次遍历,如果超过边界了,就退出循环。最后将数组转化为集合返回结果。

(2)解答
java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        if(matrix.length == 0){return new ArrayList<>();}
        int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1;
        int x = 0;
        
        Integer[] res = new Integer[(r + 1)*(b + 1)];

        while(true){
            for(int i = l; i <= r; i++){
                res[x++] = matrix[t][i];
            }
            if(++t > b)break;
            for(int i = t; i <= b; i++){
                res[x++] = matrix[i][r];
            }
            if(l > --r)break;
            for(int i = r; i >= l; i--){
                res[x++] = matrix[b][i];
            }
            if(t > --b)break;
            for(int i = b; i >= t; i--){
                res[x++] = matrix[i][l];
            }
            if(++l > r)break;

        }
        return Arrays.asList(res);
    }
}

2、旋转图像(LC 48)

(1)分析

方法一:使用辅助矩阵。

经过观察可以发现,旋转后,原本坐标为ij的元素,旋转到了jn-1-j的位置。因此,可以创建一个同样大小的矩阵,遍历每个元素,并在对应位置赋值,这个新矩阵就是旋转后的矩阵。

方法二:不使用辅助矩阵。

直接将元素ij赋值给位置jn-1-i,位置jn-1-i的位置赋值给对应的位置。以示例1来看,1放到3的位置,3放到9的位置,9放到7的位置,7放到1的位置。在实际实现过程中,会发现四个元素中有一个元素的值被覆盖了,需要用中间变量来存放,再赋值给对应位置的元素。

如果n为偶数,需要考虑前n/2列、前n/2行的元素;如果n为奇数,需要考虑前n/2列、前(n+1)/2行,或者前n/2行、前(n+1)/2列的元素。最后可以统一考虑考虑前n/2列、前(n+1)/2行,或者前n/2行、前(n+1)/2列的元素,偶数也同样适用。这样,就达到了原地旋转矩阵的要求。

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


        
    }
}
//00--02
//ij-->j(n-i-1)

3、搜索二维矩阵II(LC 240)

(1)分析

可以从左下角的元素开始遍历,坐标为ij。如果target大于matrixij,向右移动,j++;如果target小于matrixij,向上移动,i--。过程中如果遇到与target相等的,就说明矩阵中有这个元素,返回true,如果循环结束还是没遇到,说明target不存在矩阵中,返回false。

(2)解答
java 复制代码
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {

        int i = matrix.length - 1;
        int j = 0;
        while (i >= 0 && j < matrix[0].length) {
            if (matrix[i][j] < target) {
                j++;
            } else if (matrix[i][j] > target) {
                i--;
            } else {
                return true;
            }
        }
        return false;

    }
}
相关推荐
就改了18 小时前
Java8 日期处理(详细版)
java·python·算法
2601_9583529018 小时前
接上USB,焊上麦,通话瞬间安静——WX-0813如何用AI降噪+100dB消回音,把嘈杂通话变成“金子“般清晰
人工智能·算法·语音识别·硬件开发·语音模块·降噪消回音
小蒋学算法20 小时前
算法-M个非重叠子数组最大和II-WQS二分学习
数据结构·学习·算法
我要见SA姐121 小时前
AI提示词遇见精密算法:TimeGuessr如何用数学魔法打造文化游戏新体验
人工智能·算法·游戏
Jerry21 小时前
LeetCode 56. 合并区间
算法
天天有money1 天前
API中转站在社媒矩阵里的价值:多平台文案如何统一改写
gpt·线性代数·ai·chatgpt·矩阵
实验如有神祝女士1 天前
不同参数规模大模型在医学翻译场景的适配差异
论文阅读·人工智能·深度学习·学习·算法·语言模型·论文笔记
windliang1 天前
Claude Code 源码分析(三):一次模型回答如何流进 Agent
前端·算法·ai编程
Kyrie_kk1 天前
Java--BigInteger 超大整数计算
java·算法
汽车网络安全爱好者1 天前
Public Key Infrastructure(二)— 深入理解 X.509 证书:从 RFC 5280 到 OpenSSL 实践
运维·服务器·算法·网络安全·汽车·密码学·可信计算技术