给定一个整数n,将数字1到
按螺旋的顺序填入n×n的矩阵
例如:
给出的n=3,
你应该返回如下矩阵:
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
public int[][] generateMatrix(int n) { int[][] res = new int[n][n]; if (n < 1) return res; int index = 1, rowStart = 0, rowEnd = n - 1, colStart = 0, colEnd = n - 1; while (index <= n * n) { for (int i = colStart; i <= colEnd; i++) { res[rowStart][i] = index++; } for (int i = rowStart + 1; i <= rowEnd; i++) { res[i][colEnd] = index++; } for (int i = colEnd - 1; i >= colStart; i--) { res[rowEnd][i] = index++; } for (int i = rowEnd - 1; i > rowStart; i--) { res[i][colStart] = index++; } rowStart += 1; rowEnd -= 1; colStart += 1; colEnd -= 1; } return res; }
class Solution { public: vector<vector<int> > generateMatrix(int n) { vector<vector<int> > matrix(n,vector<int>(n)); int count = 1; int row_start = 0,row_end = n-1,col_start = 0,col_end = n-1; while(count <= n*n) { for(int i=col_start;i<=col_end;i++) matrix[row_start][i] = count++; row_start++; for(int i=row_start;i<=row_end;i++) matrix[i][col_end] = count++; col_end--; for(int i=col_end;i>=col_start;i--) matrix[row_end][i] = count++; row_end--; for(int i=row_end;i>=row_start;i--) matrix[i][col_start] = count++; col_start++; } return matrix; } };
public class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
// 计算圈数
int lvl = (n + 1) / 2;
int temp = 1;
for (int i = 0; i < lvl; i++) {
// 计算相对应的该圈最后一行
int lastRow = n - i - 1;
// 计算相对应的该圈最后一列
int lastCol = lastRow;
// 如果该圈第一行就是最后一行,说明只剩下一个数
if (i == lastRow)
matrix[i][i] = temp++;
else {
// 第一行
for (int j = i; j < lastCol; j++)
matrix[i][j] = temp++;
// 最后一列
for (int j = i; j < lastRow; j++)
matrix[j][lastCol] = temp++;
// 最后一行
for (int j = lastCol; j > i; j--)
matrix[lastRow][j] = temp++;
// 第一列
for (int j = lastRow; j > i; j--)
matrix[j][i] = temp++;
}
}
return matrix;
}
}
public class Solution { public int[][] generateMatrix(int n) { int[][] m = new int[n][n]; int value = 1; for (int round = 0; round < n / 2 + n % 2; round ++ ) { for (int i = round; i < n - round; i ++ ) m[round][i] = value ++ ; for (int i = round + 1; i < n - round; i ++ ) m[i][n - round - 1] = value ++ ; for (int i = n - round - 2; i >= round; i -- ) m[n - round - 1][i] = value ++ ; for (int i = n - round - 2; i >= round + 1; i -- ) m[i][round] = value ++ ; } return m; } }
public int[][] generateMatrix (int n) { // write code here int[][] matrix=new int[n][n]; if(n==0) return matrix; int begin=0,end=n-1; //起点坐标、终点坐标 int i=1; //记录当前填充值 while (matrix[begin][begin]==0){ if(begin==end){ matrix[begin][begin]=i; break; }else{ for(int j=begin;j<end;j++) //自左向右填充上行 matrix[begin][j]=i++; for(int j=begin;j<end;j++) //自上向下填充右列 matrix[j][end]=i++; for(int j=end;j>begin;j--) //自右向左填充下行 matrix[end][j]=i++; for(int j=end;j>begin;j--) //自下向上填充左列 matrix[j][begin]=i++; } begin++; end--; } return matrix; }
public int[][] generateMatrix (int n) { // write code here int[][] result = new int[n][n]; if(n == 0) {return result;} if(n == 1) { int[][] haha = new int[1][1]; haha[0][0] = 1; return haha; } int up = 0; int down = n - 1; int left = 0; int right = n - 1; int num = 1; while(true) { //最上面一行 for(int col = left; col <= right; col++) { result[up][col] = num++; } up++; if(up > down) {break;} //最右 for(int row = up; row <= down; row++) { result[row][right] = num ++; } right--; if(left > right){break;} //最下 for(int col=right;col>=left;col--) { result[down][col] = num++; } down--; if(up>down) break; //最左 for(int row = down;row>=up;row--) { result[row][left] = num++; } left++; if(left > right) break; } return result; }
public class Solution { public int[][] generateMatrix(int n) { int[][] result = new int[n][n]; int num = 1; int rowBegin = 0, rowEnd = n - 1; int colBegin = 0, colEnd = n - 1; while(rowBegin <= rowEnd && colBegin <= colEnd) { for(int i = rowBegin; i <= rowEnd; i++) { result[rowBegin][i] = num; num ++; } rowBegin ++; for(int i = rowBegin; i <= rowEnd; i++) { result[i][colEnd] = num; num ++; } colEnd --; for(int i = colEnd; i >= colBegin; i--) { result[rowEnd][i] = num; num ++; } rowEnd --; for (int i = rowEnd; i >= rowBegin; i--) { result[i][colBegin] = num; num ++; } colBegin ++; } return result; } }
public class Solution { public int[][] generateMatrix(int n) { if(n < 0) return null; int[][] matrix = new int[n][n]; int left = 0, right = n - 1; int up = 0, down = n - 1; int count = 0; //动态修改上下左右边界,并同时判断是否越界 while(true){ for(int i = left; i <= right; i++){ matrix[up][i] = ++count; } up++; if(up > down) break; for(int i = up; i <= down; i++){ matrix[i][right] = ++count; } right--; if(right < left) break; for(int i = right; i >= left; i--){ matrix[down][i] = ++count; } down--; if(up > down) break; for(int i = down; i >= up; i--){ matrix[i][left] = ++count; } left++; if(right < left) break; } return matrix; } }
public class Solution { public int[][] generateMatrix(int n) { int[][] a = new int[n][n]; if(n==0) return a; int now = 1; int r,c; for(int i=0;i<(n+1)/2;i++){ for(c=i;c<n-i;c++) a[i][c]=now++; c--; for(r=i+1;r<n-i;r++) a[r][c]=now++; r--; for(c--;c>=i;c--) a[r][c]=now++; c++; for(r--;r>i;r--) a[r][c]=now++; r++; } return a; } }
vector<vector<int> > generateMatrix(int n){ int k, i, value=1,j; vector<vector<int> > res(n, vector<int>(n)); for(k=0; k<(n+1)/2; k++){ for(i=k; i<n-k; i++) res[k][i]=value++; for(i=k+1; i<n-k; i++) res[i][n-k-1]=value++; for(i=n-k-2; i>=k; i--) res[n-k-1][i]=value++; for(i=n-k-2; i>k; i--) res[i][k]=value++; } return res; }
class Solution { public: vector<vector<int> > generateMatrix(int n) { int count = 1; int left_x = 0, left_y = 0; int right_x = n-1, right_y = n-1; vector<vector<int> > mat(n, vector<int>(n)); while (left_x <= right_x) { for (int i = left_x; i <= right_y;i++) { mat[left_x][i] = count; count++; } for (int j = left_x + 1; j <= right_x;j++) { mat[j][right_y] = count; count++; } for (int i = right_y - 1; i >= left_y;i--) { mat[right_x][i] = count; count++; } for (int j = right_x - 1; j >= left_x + 1;j--) { mat[j][left_y] = count; count++; } left_x++; left_y++; right_x--; right_y--; } return mat; } };
import java.util.*; public class Solution { /** * * @param n int整型 * @return int整型二维数组 */ public int[][] generateMatrix (int n) { int[][] arr = new int[n][n]; if(n == 0){ return arr; } int s = 0; int num = 2; int end = n * n; int i = 0; int j = 0; arr[0][0] = 1; for (int k = 1; k < end; k++) { if (s == 0) { j++; } else if (s == 1) { i++; } else if (s == 2) { j--; } else if (s == 3) { i--; } arr[i][j] = num++; if (s == 0 && (j >= n - 1 || arr[i][j + 1] != 0)) { s++; } else if (s == 1 && (i >= n - 1 || arr[i + 1][j] != 0)) { s++; } else if (s == 2 && (j == 0 || arr[i][j - 1] != 0)) { s++; } else if (s == 3 && (arr[i - 1][j] != 0)) { s = 0; } } return arr; } }
/* 思路: 本题思路和螺旋遍历矩阵相同,也是需要螺旋遍历矩阵,只不过是在遍历的时候赋值 需要注意输入的n为负数 */ class Solution { public: /** * * @param n int整型 * @return int整型vector<vector<>> */ vector<vector<int> > generateMatrix(int n) { //将负数转为正数 n = (n<0)?(0-n):n; vector<vector<int>> arr(n,vector<int>(n)); if(n==0){ return arr; } int up = 0; int down = arr.size()-1; int left = 0; int right = arr[0].size()-1; int target = 1; while(up<=down && left<=right){ //从左向右搜索 for(int col=left;col<=right;col++){ arr[up][col] = target; target++; } //从上向下搜索 for(int row=up+1;row<=down;row++){ arr[row][right] = target; target++; } //边界检测 if(up<down && left<right){ //从右到左搜索 for(int col=right-1;col>=left;col--){ arr[down][col] = target; target++; } //从下到上搜素 for(int row=down-1;row>up;row--){ arr[row][left] = target; target++; } } up++; down--; left++; right--; } return arr; } };
定义左边界右边界(由矩阵的性质可得,左边界也是上边界、右边界也是下边界),以左边界作为循环条件,循环打印即可:
// // Created by jt on 2020/9/29. // #include <vector> using namespace std; class Solution { public: /** * * @param n int整型 * @return int整型vector<vector<>> */ vector<vector<int> > generateMatrix(int n) { // write code here vector<vector<int>> res(n, vector<int>(n)); for (int left = 0, right = n - 1, current = 1; left <= n / 2; ++left, --right) { // 上 for (int j = left; j <= right; ++j) { res[left][j] = current++; } // 右 for (int j = left + 1; j <= right; ++j) { res[j][right] = current++; } // 下 for (int j = right-1; j >= left; --j) { res[right][j] = current++; } // 左 for (int j = right-1; j > left; --j) { res[j][left] = current++; } } return res; } };
/*每一个螺旋可以由起始位置确定,四角坐标表示为: (start,start),(start,n-start-1) (n-start-1,start),(n-start-1,n-start-1) */ int[][] res = new int[n][n]; int startIndex = 0; int val = 1; if (n < 1 || n > 1000) { return res; } while (startIndex <= (n - 1) / 2) { if (startIndex == (n - 1 / 2)) { res[startIndex][startIndex] = val; break; } for (int right = startIndex; right < (n - startIndex); right++) { //向右 res[startIndex][right] = val; val++; } for (int height = startIndex + 1; height < (n - startIndex); height++) {//下 res[height][n - startIndex - 1] = val; val++; } for (int left = (n - startIndex) - 2; left >= startIndex; left--) { //左 res[n - startIndex - 1][left] = val; val++; } for (int up = (n - startIndex) - 2; up > startIndex; up--) { //上 res[up][startIndex] = val; val++; } startIndex++; } return res;
class Solution { public: vector<vector<int> > generateMatrix(int n) { if (!n) return vector<vector<int>>(); int i = 0, d[4][2] = {0, 1, 1, 0, 0, -1, -1, 0}, j = 0, k = -1; vector<vector<int>> res(n, vector<int>(n)); for (int m = 1; m <= n * n; m++) { int a = j + d[i][0], b = k + d[i][1]; if (a < 0 || a >= n || b < 0 || b >= n || res[a][b]) i = (i + 1) % 4; j += d[i][0]; k += d[i][1]; res[j][k] = m; } return res; } };
思路:
五个参数:left、right、top、bottom、count(计数)
循环结束条件:count == n*n
注意:四个参数的++和- -
import java.util.*; public class Solution { /** * * @param n int整型 * @return int整型二维数组 */ public int[][] generateMatrix (int n) { // write code here int[][] res = new int[n][n]; if(n<1) return res; int left = 0; int right = n-1; int top = 0; int bottom = n-1; int count=1; while(count<=n*n) { for(int i = left ; i<=right ;i++) { res[top][i]=count; count++; } top++; for(int i=top;i<=bottom;i++) { res[i][right]=count; count++; } right--; for(int i=right;i>=left;i--) { res[bottom][i]=count; count++; } bottom--; for(int i=bottom;i>=top;i--) { res[i][left]=count; count++; } left++; } return res; } }