螺旋矩阵
59、螺旋矩阵二
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
就是模拟:
1、从左到右遍历,上边界++,如果上边界大于下边界,结束循环。
2、从上到下遍历,右边界–,如果右边界小于左边界,结束循环。
3、从右到左遍历,下边界–,如果下边界小于上边界,结束循环。
4、从下到上遍历,左边界++,如果左边界大于右边界,结束循环。
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
int l=0,r=n-1,u=0,d=n-1; //上下左右边界赋值
int count=1;
while(true)
{
for(int i=l;i<=r;i++) //每一个方向后 移动一次!
res[u][i]=count++;
u++; //重新设定上边界,若上边界大于下边界,则遍历遍历完成,下同
if(u>d) break;
for(int i=u;i<=d;i++)
res[i][r]=count++;
r--; //重新设定右边界
if(r<l) break;
for(int i=r;i>=l;i--)
res[d][i]=count++;
d--; //重新设定下边界
if(d<u) break;
for(int i=d;i>=u;i--)
res[i][l]=count++;
l++; //重新设定左边界
if(l>r) break;
}
return res;
}
}
#54、螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入: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]
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int m=matrix.length;
int n=matrix[0].length;
List<Integer> result =new ArrayList<>();
int l=0,r=n-1,u=0,d=m-1;
while(true)
{
for(int i=l;i<=r;i++)
{
result.add(matrix[u][i]);
}
if(++u>d) break;
for(int i=u;i<=d;i++)
{
result.add(matrix[i][r]);
}
if(--r<l) break;
for(int i=r;i>=l;i--)
{
result.add(matrix[d][i]);
}
if(--d<u) break;
for(int i=d;i>=u;i--)
{
result.add(matrix[i][l]);
}
if(++l>r) break;
}
return result;
}
}
#73、矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
示例 1:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
class Solution {
//用第一行和第一列来代替两个标记数组,来记录其他行其他列是否有0
//使用两个标记变量来记录第一行和第一列是否有0
//不会破坏第一行和第一列的元素,因为如果其他行或者列有0
//则会把对应的第一行或第一列变为0来记录,而且本就就是要变为0的
//如果第一行或者第一列本身就是0的话,则也相当于记录。
public void setZeroes(int[][] matrix) {
int m=matrix.length;
int n=matrix[0].length;
boolean flagCol=false; //记录第一列是否含有0
boolean flagRow=false;//记录第一列是否有含有0
for(int i=0;i<m;i++)
{
if(matrix[i][0]==0)
flagCol=true;
}
for(int j=0;j<n;j++)
{
if(matrix[0][j]==0)
flagRow=true;
}
//遍历每个元素,打上标记
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
if(matrix[i][j]==0)
matrix[i][0]=matrix[0][j]=0; //对应的标记
}
}
//遍历每个元素,如果对应的标记为0,则赋值
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
if(matrix[i][0]==0|| matrix[0][j]==0)
matrix[i][j]=0;
}
}
if(flagCol)
{
for(int i=0;i<m;i++)
{
matrix[i][0]=0;
}
}
if(flagRow)
{
for(int j=0;j<n;j++)
matrix[0][j]=0;
}
}
}
#48、旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
class Solution {
//使用翻转来达到旋转的效果
public void rotate(int[][] matrix) {
int n=matrix.length;
//水平翻转
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n;j++)
{
int temp=matrix[i][j];
matrix[i][j]=matrix[n-1-i][j];
matrix[n-i-1][j]=temp;
}
}
//主对角线翻转
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
int temp=matrix[i][j];
matrix[i][j]=matrix[j][i];
matrix[j][i]=temp;
}
}
}
}
#240、搜索二维矩阵 II
编写一个高效的算法来搜索 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
Z字形查找:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m=matrix.length;
int n=matrix[0].length;
int x=0,y=n-1; //从右上角开始
while(x<m && y>=0)
{
if(matrix[x][y]==target)
return true;
//如果matrix[x][y]>target,说明第y列后面的都大于target
if(matrix[x][y]>target)
y--;
//如果matrix[x][y]<target,说明第x行前面的都小于target
else{
x++;
}
}
return false;
}
}