螺旋矩阵
解题心得:
本题要坚持循环不变量原则,主要是保证每次模拟走圈,保证一致性,循环变量遵从左闭右开的原则。按照固定规则进行遍历。
另外还要注意边界情况处理,比如n为奇数,需要进行额外判断,这时候矩阵中心的元素为
[n/2][n/2]=计数器。
代码(c#)
#python代码
def traverse_matrix(n):
matrix = [[0] * n for _ in range(n)]
counter = 1
start = 0
end = n - 1
while start <= end:
if start == end: # 处理矩阵中心的元素
matrix[start][end] = counter
break
# 从左到右遍历上边
for i in range(start, end):
matrix[start][i] = counter
counter += 1
# 从上到下遍历右边
for i in range(start, end):
matrix[i][end] = counter
counter += 1
# 从右到左遍历下边
for i in range(end, start, -1):
matrix[end][i] = counter
counter += 1
# 从下到上遍历左边
for i in range(end, start, -1):
matrix[i][start] = counter
counter += 1
# 缩小矩阵规模
start += 1
end -= 1
return matrix
//c#代码
public class Solution {
public int[][] GenerateMatrix(int n) {
int [][] answer = new int[n][];
for(int i=0;i<n;i++){
answer[i]=new int[n];
}
int start = 0;
int end = n-1;
int tmp = 1;
while(tmp<n*n){
for(int i= start;i<end;i++){
answer[start][i]=tmp;
tmp++;
}
for(int i=start;i<end;i++){
answer[i][end]=tmp;
tmp++;
}
for(int i=end;i>start;i--){
answer[end][i]=tmp;
tmp++;
}
for(int i=end;i>start;i--){
answer[i][start]=tmp;
tmp++;
}
start++;
end--;
}
if(n%2 == 1){
answer[n/2][n/2]=tmp;
}
return answer;
}
}
根据你的要求,我理解你想要优化一个按照固定规则进行遍历的循环不变量原则。你提到了一些边界情况的处理,比如当n为奇数时,需要进行额外判断,以及矩阵中心的元素为计数器。我将根据你的描述给出一个更具逻辑性的优化方案:
在这个优化后的代码中,我们使用了四个循环分别遍历矩阵的上边、右边、下边和左边。我们使用counter
变量来记录当前的计数值,每遍历一个位置,就将counter
的值赋给该位置,并将counter
加一。在处理奇数情况时,我们额外判断了start
和end
是否相等,如果相等,则说明只有一个中心元素,将其赋值为counter
。
这个优化后的算法保证了按照固定规则进行遍历,并处理了边界情况,使其更具有逻辑性和一致性。