LeeCode热题 100打卡第十三天
第一题:旋转图像(LeeCode第48题):
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
解法一:(使用了一维数组,这个有点钻了空子,不太推荐,建议还是参考解法二的原地交换,但这是我最先想到的解法)
找到转换后的矩阵和原矩阵之间的关系,然后将转换后的矩阵按顺序存入一维数组,再用转换后的一维数组去覆盖原二维数组的值。
class Solution {
public void rotate(int[][] matrix) {
List<Integer> list = new ArrayList<>();
for(int j = 0; j < matrix.length; j++){
for(int i = matrix.length - 1 ; i >= 0; i--)
list.add(matrix[i][j]);
}
int k = 0;
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix.length; j++){
matrix[i][j] = list.get(k++);
}
}
}
}
解法二:(原地交换)
主要思想,找出转换后的矩阵如何由原矩阵获得。先将原矩阵按对角线进行翻转,再将矩阵左右进行翻转即可得到目标矩阵
class Solution {
public void rotate(int[][] matrix) {
int temp;
for(int i = 0; i < matrix.length; i++){
for(int j = i; j < matrix.length; j++){
temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
for(int i = 0; i < matrix.length; i++){
for(int k = 0; k < matrix.length/2; k++){
temp = matrix[i][k];
matrix[i][k] = matrix[i][matrix.length - k -1];
matrix[i][matrix.length - k -1] = temp;
}
}
}
}
第二题:搜索二维矩阵II(LeeCode第240题):
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。
主要思想:最核心的思想将这个矩阵看作一颗二叉搜索树,
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<>();
int startx = 0,starty = 0, offset = 1, m = matrix.length, n = matrix[0].length;
int loop = Math.min(m, n) / 2;
int i, j;
while(loop-- >0){
for(j = starty; j < n - offset; j++){
list.add(matrix[startx][j]);
}
for(i = startx; i < m - offset; i++){
list.add(matrix[i][j]);
}
for(; j > starty; j--){
list.add(matrix[i][j]);
}
for(; i > startx; i--){
list.add(matrix[i][j]);
}
startx++;
starty++;
offset++;
}
if(Math.min(m, n) % 2 == 1){
if(m < n){
for(j = starty; j <= n - offset; j++) list.add(matrix[startx][j]);
}else{
for(i = startx; i <= m - offset; i++) list.add(matrix[i][starty]);
}
}
return list;
}
}