给定一个整数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;
}
}