73-矩阵置零
给定一个 m
xn 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用原地算法
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]
输入:matrix = [[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
java
class Solution {
public void setZeroes(int[][] matrix) {
int m=matrix.length,n=matrix[0].length;
boolean [] l=new boolean [m];
boolean[] w=new boolean [n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(matrix[i][j]==0){l[i]=true;w[j]=true;}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(l[i]||w[j]){matrix[i][j]=0;}
}
}
}
}
**细节注意:**n=matrix[0].length 列的取长要[ 0 ] ,不能为空。
行列标记用布尔最方便
54-螺旋矩阵(贪吃蛇)
给你一个
m行n列的矩阵matrix,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
思路:移动过程中会碰到边界或遇到已读,然后需要判断方向且变换方向。方向使用预留的四种,通过索引方式来回试 合适就走,使用已读visited矩阵标记已读。索引分四个方向,m和n放在一起,使用模4进行更新。
java
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List <Integer> ans=new ArrayList<Integer>();//设置动态数组存结果
int M=matrix.length;
int N=matrix[0].length;
boolean [][] visited=new boolean [M][N];//设置已读
int [][] dir={{0,1},{1,0},{0,-1},{-1,0}};//四个方向:右下左上
int m=0,n=0; //初始化第一个位置
int index=0; //控制方向的索引
for(int i=0;i<M*N;i++){
ans.add(matrix[m][n]);//存当前值
visited[m][n]=true;//将改值改为已读
int nextm=m+dir[index][0];//查下一个是谁,不赋值给mn,纯试探来求index
int nextn=n+dir[index][1];
//判断下一个是否越界,求索引
//不越界索引不变,越界则换方向,模4代表四个来回试
if(nextm<0||nextm>=M||nextn<0||nextn>=N||visited[nextm][nextn]){
index=(index+1)%4;
}
//执行新方向
m+=dir[index][0];
n+=dir[index][1];
}
return ans;
}
}
48-旋转图像
给定一个 n × n 的二维矩阵
matrix表示一个图像。请你将图像顺时针旋转 90 度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]]
输入: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]]
**思路:**简单,矩阵从[ i ][ j ] 变成 [ j ][ m-i-1 ],再换回来原矩阵
java
class Solution {
public void rotate(int[][] matrix) {
int m=matrix.length;
int n=matrix[0].length;
int [][] matrix2=new int [m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
matrix2[j][m-i-1]=matrix[i][j];
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
matrix[i][j]=matrix2[i][j];
}
}
}
}
编写一个高效的算法来搜索 m
xn 矩阵matrix中的一个目标值target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。
输入: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
输入: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
**思路:**暴力解法,能解出来就行,我管你这呢那呢。
有序可以使用二分查找
java
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m=matrix.length;
int n=matrix[0].length;
boolean ans=false;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(matrix[i][j]==target){
ans=true;}
}
}
return ans;
}
}