给你一个正整数 n ,生成一个包含 1 到 n*n 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

矩阵示例

解决问题: 一开始想的代码及其复杂,最重要的一点就是区间没有解决好,如果每次都处理长度相同的列/行困难就会少很多,这里着重讲一下优化的思路

  • 首先我们要确定绕多少圈,经过计算得知是n/2圈,这里注意如果是n是奇数还要最后判断并往矩阵中心赋值
  • 然后定义起始的x和y坐标作为标定,也就是循环不变量,接着kk开始转一圈,第一条从y开始,所以j起始于start_y,但是这里要注意,偏移值也就是我们每次要处理的固定长度与n的差,可以想到第一圈是1,那么第m圈就是m
  • 在处理完四条边后,起始的x和y都要进行增加,相应的偏移也要随着圈数的增加而增加
public int[][] generateMatrix(int n) {
        //起始位置
        int start_x=0;
        int start_y=0;
        int offset=1;
        int count=1;
        int[][] nums=new int[n][n];
        int runs=n/2;
        int temp=0;
        int i=0,j=0;
        while(temp<runs){
            temp++;

            for(j=start_y;j<n-offset;j++){
                nums[start_x][j]=count++;
            }
            for(i=start_x;i<n-offset;i++){
                nums[i][j]=count++;
            }
            for(;j>start_y;j--){
                nums[i][j]=count++;
            }
            for(;i>start_x;i--){
                nums[i][j]=count++;
            }

            start_y++;
            start_x++;
            offset++;
        }
        if(n%2==1){


            nums[start_x][start_y]=count;
        }
        return nums;
    }

健身的墨镜
1 声望0 粉丝

引用和评论

0 条评论