【LeetCode-面試算法經典-Java實現】【059-Spiral Matrix II(螺旋矩陣II)】
阿新 • • 發佈:2017-08-15
mod 最大 http 計算 spiral tro parent 全部 matrix
【059-Spiral Matrix II(螺旋矩陣II)】
【LeetCode-面試算法經典-Java實現】【全部題目文件夾索引】
原題
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3,
You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
題目大意
給定一個整數n。生成一個n*n的矩陣,用1-n^2的數字進行螺旋填充。
解題思路
採用計算生成法,對每個位置計算相應的數。
代碼實現
算法實現類
public class Solution {
public int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
int layer;
int k;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
layer = layer(i, j, n); // 當前坐標外有幾層
// n * n - layer * layer外圍層使用的最後一個數字(也是最大的)
// 坐標所在的當前層使用的第一個數字
k = n * n - (n - 2 * layer) * (n - 2 * layer) + 1;
result[i][j] = k;
// (n - 2 * layer - 1):四個(n - 2 * layer - 1)就是(x,y)坐標所在層的全部元素個數
if (i == layer) { // 情況一、坐標離上邊界近期
result[i][j] = k + j - layer;
} else if (j == n - layer - 1) { // 情況二、坐標離右邊界近期
result[i][j] = k + (n - 2 * layer - 1) + i - layer;
} else if (i == n - layer - 1) { // 情況三、坐標離下邊界近期
result[i][j] = k + 3 * (n - 2 * layer - 1) - (j - layer);
} else { // 情況三、坐標離左邊界近期
result[i][j] = k + 4 * (n - 2 * layer - 1) - (i - layer);
}
}
}
return result;
}
/**
* 在一個n*n的矩陣中,計算(x,y)坐標外有多少層,坐標從0開始計算
*
* @param x 橫坐標
* @param y 縱坐標
* @param n 矩陣大小
* @return 坐標外的層數
*/
public int layer(int x, int y, int n) {
x = x < n - 1 - x ? x : n - 1 - x; // 計算橫坐標離上下邊界的近期距離
y = y < n - 1 - y ? y : n - 1 - y; // 計算縱坐標離左右邊界的近期距離
return x < y ? x : y; // 較小的值為坐標的外圍層數
}
}
評測結果
點擊圖片,鼠標不釋放,拖動一段位置,釋放後在新的窗體中查看完整圖片。
特別說明
歡迎轉載。轉載請註明出處【http://blog.csdn.net/derrantcm/article/details/47164439】
【LeetCode-面試算法經典-Java實現】【059-Spiral Matrix II(螺旋矩陣II)】