一、杨辉三角II
leetcode 119 杨辉三角II
利用二维矩阵来存储杨辉三角,注意题中默认第一行为0,所有第一个循环i<=rowIndex ,杨辉三角的特性就是每行的第一个元素和最后一个元素都为1,其他元素都是上一行上面的左右元素之和,之后返回对应行数即可。
public List<Integer> getRow(int rowIndex) {
//利用二维矩阵来存储杨辉三角,返回相应的行即可
List<List<Integer>> res=new ArrayList<>();
for(int i=0;i<=rowIndex;i++){//注意这里要等于题中默认第一行为0,所以rowIndex=3 其实是第四行 行
List<Integer> list=new ArrayList<>();
for(int j=i;j>=0;j--){//这里第第四行有四个,即为rowIndex+1 列
if(i==j||j==0){
list.add(1);
}else{
list.add(res.get(i-1).get(j)+res.get(i-1).get(j-1));//每行元素是上一行左右元素之和
}
}
res.add(list);
}
return res.get(rowIndex);
}
二、旋转图像
leetcode 48 旋转图像
如果再使用一个矩阵就是将第一行的元素放到最后一行,第二行元素放到倒数第二列,依次类推,但是题中说原地修改,所以这里就先转置,再反转
public void rotate(int[][] matrix) {
//先进行转置,将第一列变为第一行,
int n=matrix.length;
for(int i=0;i<n;i++){//
for(int j=i;j>=0;j--){
int temp=matrix[i][j];
matrix[i][j]=matrix[j][i];
matrix[j][i]=temp;
}
}
//转置完成,在进行反转
//每一行内部进行交换
for(int i=0;i<n;i++){
int l=0; int r=n-1;
while(l<r){
int temp=matrix[i][l];
matrix[i][l]=matrix[i][r];
matrix[i][r]=temp;
l++; r--;
}
}
}
三、螺旋矩阵
leetcode 54 螺旋矩阵
要实现顺时针遍历,定义四个变量来实现:
left right up down
先是 left -> right 方向为→
之后是 right -> down 方向为↓
之后为 right ->left 方向为←
之后为 down-> up 方向为↑ 依次遍历存放即可
public List<Integer> spiralOrder(int[][] matrix) {
//螺旋矩阵 定义四个变量来实现
int row = matrix.length; //定义行数
int col = matrix[0].length; //定义列数
List<Integer> list=new ArrayList<>();
int len=row*col;
int left=0;//定义四个坐标变量
int right=col-1;
int up=0;
int down=row-1;
int index=0;
//遍历模拟顺时针旋转
while(index<len){
for(int i=left;i<=right;i++){
list.add(matrix[up][i]);
index++;
if(index==len){
return list;
}
}
up++;
for(int i=up;i<=down;i++){
list.add(matrix[i][right]);
index++;
if(index==len){
return list;
}
}
right--;
for(int i=right;i>=left;i--){
list.add(matrix[down][i]);
index++;
if(index==len){
return list;
}
}
down--;
for(int i=down;i>=up;i--){
list.add(matrix[i][left]);
index++;
if(index==len){
return list;
}
}
left++;
}
return list;
}
四、螺旋矩阵 II
leetcode 59 螺旋矩阵 II
这个题和上一个很像也是从四个方向遍历,只是其他的稍微变了一点
public int[][] generateMatrix(int n) {
int [][]res=new int[n][n];
int left=0;
int right=n-1;
int up=0;
int down=n-1;
int cur=1;
while(left<=right&&up<=down){
//从四个方向遍历 → ↓ ← ↑
for(int i=left;i<=right;i++){
res[up][i]=cur++;
}
up++;
if(up>down) break;
for(int i=up;i<=down;i++){
res[i][right]=cur++;
}
right--;
if(left>right) break;
for(int i=right; i>=left ;i--){
res[down][i]=cur++;
}
down--;
if(up>down) break;
for(int i=down;i>=up;i--){
res[i][left]=cur++;
}
left++;
if(left>right) break;
}
return res;
}