1、旋转矩阵
旋转矩阵
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
示例 1:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 2:
给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
法一、暴力解法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g33Ven14-1634391315675)(C:\Users\axi\AppData\Roaming\Typora\typora-user-images\image-20211016160149075.png)]
-
弄一个大小相同的新数组
-
两层循环遍历,外层控制行,内层控制列
-
拿新矩阵第一行举例,第一个元素是原矩阵的第一列最后一个元素,故
newMatrix[i][j] = matrix[matrix.length - j -1][i];
class Solution {
public void rotate(int[][] matrix) {
int[][] newMatrix = new int[matrix.length][matrix.length];
for (int i = 0; i < matrix.length ; i++){
for (int j = 0 ; j < matrix.length ; j++){
newMatrix[i][j] = matrix[matrix.length - j -1][i];
}
}
for (int i = 0; i < matrix.length ; i++){
for (int j = 0 ; j < matrix.length ; j++){
matrix[i][j] = newMatrix[i][j];
}
}
}
}
法二、翻转矩阵
先水平翻转再主对角线翻转。
- 水平翻转
class Solution {
public void rotate(int[][] matrix) {
int li = matrix.length / 2;
int n = matrix.length;
int temp = 0;
for (int i = 0 ; i < li ; i++){
for (int j = 0; j < n ; j ++){
temp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - i][j];
matrix[n - 1 - i][j] = temp;
}
}
for (int i = 0 ; i < n ; i++){
for (int j = 0; j < n ; j ++){
if (j > i){
temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
}
}
2、零矩阵
零矩阵
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
示例 1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
示例 2:
输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
思路:
- 既然我们会清空只要有0在的行与列,那么不妨只记录他们所在的行列,而不关心他们的坐标,因为可能有多个0。
- 我们建立两个布尔数组,用于记录哪行哪列是空的。
- 进行遍历,将记录的行与列,只要满足行和列其中一个在记录中,就把它置为0。
class Solution {
public void setZeroes(int[][] matrix) {
boolean[] row = new boolean[matrix.length];
boolean[] col = new boolean[matrix[0].length];
for (int i = 0 ; i < matrix.length ; i++){
for(int j = 0; j < matrix[0].length ; j++){
if(matrix[i][j] == 0){
row[i] = true;
col[j] = true;
}
}
}
for (int i = 0 ; i < matrix.length ; i++){
for(int j = 0; j < matrix[0].length ; j++){
if(row[i] || col[j])
matrix[i][j] = 0;
}
}
}
}
3、求1+2+3+……+n
要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
思路:
- 巧妙利用短路与
- 定义一个boolean变量,flag,进行递归求和。
public int sumNums(int n) {
int sum = n;
boolean flag = n > 0 && (sum += sumNums(n-1)) > 0;
return sum;
}