Leetcode 48旋转图像(水平+主对角线)、Leetcode 221最大正方形(动态规划dp表示以ij为右下角的答案值)、Leetcode 240搜索二维矩阵II(排除行列法)

Top1:Leetcode 48旋转图像(水平+主对角线)

与leetcode面试题01.07是一个题https://leetcode.cn/problems/rotate-matrix-lcci/
题目描述:
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
在这里插入图片描述

一、水平翻转i:下标0到n/2【中间+firstEnd】,j:0到col交换ij与n-i-1,j+主对角线翻转i:下标0到rows,j:0到<i交换ij

主对角线是斜向右下的那条

  • 时间复杂度:O(1)。其中 N 是matrix 的边长。对于每一次翻转操作,水平翻转我们都需要枚举矩阵中一半的元素。
  • 空间复杂度:O(1)。原地反转常数级别复杂度。

可通过完整代码:

public void rotate(int[][] matrix) {
    int n = matrix.length;
    // 水平翻转
    for (int i = 0; i < n / 2; i++) {   // 下标 【中间】 和 【上半部分end】
        for (int j = 0; j < n; j++) {
            int tem = matrix[i][j];
            matrix[i][j] = matrix[n - i - 1][j];   // 下标要-1,想一下就可以写好了
            matrix[n - i - 1][j] = tem;
        }
    }
    // 主对角线翻转
    for (int i = 0; i < n; i++) {   // 主对角线下半部分,当i=1,j只能0;i=2,j只能0,1
        for (int j = 0; j < i; j++) {
            int tem = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = tem;
        }
    }
}

在这里插入图片描述

Top2:Leetcode 221最大正方形(动态规划dp表示以ij为右下角的答案值)

官方题解:https://leetcode.cn/problems/maximal-square/solution/zui-da-zheng-fang-xing-by-leetcode-solution/
题目描述:
在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。
在这里插入图片描述

一、dp[i][j]表示以ij为右下角,且只包含1的则正方形的边长最大值。

二、如果dp[i][j]=='1’就初始化i=0 || j=0的位置=1,否则还是默认为0。接着ij位置的等于上方、左方、左上方的最小值。

在这里插入图片描述

  • 时间复杂度:O(mn)。其中m和n是矩阵的行数和列数。需要遍历源实矩阵中的每个元素计算dp值。
  • 空间复杂度:O(mn)。我们创建了一个和原始矩阵相同大小的矩阵dp。
  • 注意空间复杂度优化:由于状态转移方程中的 dp(i,j) 由其上方、左方和左上方的三个相邻位置的dp 值决定,因此可以使用两个一维数组进行状态转移,空间复杂度优化至 O(n)。

可通过完整代码:

public int maximalSquare(char[][] matrix) {
    int ans = 0;
    if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return ans;
    int rows = matrix.length, columns = matrix[0].length;
    int[][] dp = new int[rows][columns];
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            if (matrix[i][j] == '1') {
                if (i == 0 || j == 0) {
                    dp[i][j] = 1;
                } else {
                    dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
                }
                ans = Math.max(ans, dp[i][j]);
            }
        }
    }
    return ans * ans;
}

在这里插入图片描述

Top3:Leetcode 240搜索二维矩阵II(排除行列法)

官方题解:https://leetcode.cn/problems/search-a-2d-matrix-ii/solution/sou-suo-er-wei-ju-zhen-ii-by-leetcode-so-9hcx/
题目描述:
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

示例1:
在这里插入图片描述
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

示例2:
在这里插入图片描述
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出:false

一、初始下标x=0,y=length-1。while循环遍历(x<m&&y>=0)当matrix[x][y] > target的时候说明y这一列都比matrix[x][y]大,y–排除一列缩小范围;当else意思就是matrix[x][y] < target的时候说明这一行都比matrix[x][y]小,x++排除上一行。

最后返回布尔值

  • 时间复杂度:O(m+n)。在搜索的过程中,如果我们没有找到 target,那么我们要么将 y 减少 11,要么将 x 增加 11。由于(x,y) 的初始值分别为(0,n−1),因此 y 最多能被减少 n 次,x 最多能被增加 m 次,总搜索次数为 m+n。
  • 空间复杂度:O(1)。常数级空间复杂度。

可通过完整代码:

public boolean searchMatrix(int[][] matrix, int target) {
    int m = matrix.length, n = matrix[0].length;
    int x = 0, y = n - 1;
    while (x < m && y >= 0) {
        if (matrix[x][y] == target) return true;
        if (matrix[x][y] > target) y--;   // 这一列所有元素都>target,忽略这一列
        else x++;   // 这一行所有元素都< target,忽略这一行
    }
    return false;
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值