leetcode第48题

简介: 将一个矩阵顺时针旋转 90 度,并且不使用额外的空间。大概属于找规律的题,没有什么一般的思路,观察就可以了。解法一可以先转置,然后把每列对称交换交换一下

image.png

将一个矩阵顺时针旋转 90 度,并且不使用额外的空间。大概属于找规律的题,没有什么一般的思路,观察就可以了。

解法一

可以先转置,然后把每列对称交换交换一下

image.png

publicvoidrotate(int[][] matrix) {
//以对角线为轴交换for (inti=0; i<matrix.length; i++) {
for (intj=0; j<=i; j++) {
if (i==j) {
continue;
            }
inttemp=matrix[i][j];
matrix[i][j] =matrix[j][i];
matrix[j][i] =temp;
        }
    } 
//交换列for (inti=0, j=matrix.length-1; i<matrix.length/2; i++, j--) {
for (intk=0; k<matrix.length; k++) {
inttemp=matrix[k][i];
matrix[k][i] =matrix[k][j];
matrix[k][j] =temp;
        }
    }
}

时间复杂度:O(n²)。

空间复杂度:O(1)。

也可以先以横向的中轴线为轴,对称的行进行交换,然后再以对角线交换。

解法二

我把这个链接的思路贴过来,里边评论有张图也都顺道贴过来吧,写的很好。

image.png

一圈一圈的循环交换,很妙!

publicvoidrotate(int[][] matrix) {
intn=matrix.length;
for (inti=0; i<n/2; i++) 
for (intj=i; j<n-i-1; j++) {
inttmp=matrix[i][j];
matrix[i][j]=matrix[n-j-1][i];
matrix[n-j-1][i]=matrix[n-i-1][n-j-1];
matrix[n-i-1][n-j-1]=matrix[j][n-i-1];
matrix[j][n-i-1]=tmp;
        }
}

时间复杂度:O(n²)。

空间复杂度:O(1)。

这道题就是对题目的特征进行观察就可以了。


相关文章
|
3月前
|
算法
leetcode:389. 找不同
leetcode:389. 找不同
10 0
|
10月前
|
存储
leetcode:53.最大字序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
31 0
leetcode 827 最大人工岛
leetcode 827 最大人工岛
45 0
leetcode 827 最大人工岛
|
算法 Java
一和零(LeetCode 474)
一和零(LeetCode 474)
71 0
leetcode
在排序数组中查找元素的第一个和最后一个位置
|
算法
leetcode第34题
第二种思路,参考这里。 我们开始更新 start 的时候,是 mid + 1,如果剩两个元素,例如 2 4,target = 6 的话,此时 mid = 0,start = mid + 1 = 1,我们返回 start + 1 = 2。如果 mid 是右端点,那么 mid = 1,start = mid + 1 = 2,这样就可以直接返回 start 了,不需要在返回的时候加 1 了。
leetcode第34题
|
存储
leetcode第56题
常规的思想,将大问题化解成小问题去解决。 假设给了一个大小为 n 的列表,然后我们假设 n - 1 个元素的列表已经完成了全部合并,我们现在要解决的就是剩下的 1 个,怎么加到已经合并完的 n -1 个元素中。 这样的话分下边几种情况, 我们把每个范围叫做一个节点,节点包括左端点和右端点。 1. 如下图,新加入的节点左端点和右端点,分别在两个节点之间。这样,我们只要删除
leetcode第56题
|
机器学习/深度学习
leetcode第50题
求幂次方,用最简单的想法,就是写一个 for 循环累乘。 至于求负幂次方,比如 2^{-10}2−10,可以先求出 2^{10}210,然后取倒数,1/2^{10}1/210 ,就可以了 double mul = 1; if (n > 0) { for (int i = 0; i < n; i++) { mul *= x; } } else { n = -n; for (int i = 0; i < n; i++) { mul *= x; } mul = 1 / mul; }
leetcode第50题
leetcode第37题
从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。
leetcode第37题
|
算法
leetcode第47题
基本上都是在上道题的基础上改出来了,一些技巧也是经常遇到,比如先排序,然后判断和前一个是否重复。利用 Hash 去重的功能。利用原来的存储空间隐藏掉数据,然后再想办法还原。
leetcode第47题