代码随想录-数组5-螺旋矩阵

 


螺旋矩阵

LeetCode链接

解题心得:

本题要坚持循环不变量原则,主要是保证每次模拟走圈,保证一致性,循环变量遵从左闭右开的原则。按照固定规则进行遍历。

另外还要注意边界情况处理,比如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加一。在处理奇数情况时,我们额外判断了startend是否相等,如果相等,则说明只有一个中心元素,将其赋值为counter

这个优化后的算法保证了按照固定规则进行遍历,并处理了边界情况,使其更具有逻辑性和一致性。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值