leetcode54螺旋矩阵 leetcode59螺旋矩阵||

在这里插入图片描述在这里插入图片描述

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
循环遍历 flag=0时代表的是第一行 即1 2 3 4 5
flag=1 时遍历 10 15 20
flag=2 时遍历 19 18 17 16
flag=3 时遍历 11 6
整个矩阵可以从外到里这样一圈圈遍历 但是要注意没遍历完一圈都要重新修改边界值

int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
    * returnSize=0;
	int r=matrixSize,c=* matrixColSize;
    if(matrix==NULL || r==0) return matrix;
    int *answer=(int*)malloc((10000)*sizeof(int));
    int i=0;
    int j=0;
    int k=0;
    int flag=0;
    int limit1=* matrixColSize;
    int limit2=matrixSize;
    int limit3=0;
    int limit4=1;
    int m=0;
    *returnSize=r*c;
    while(k<*returnSize)
    {
        if(flag==0)
        {
            for(m=j;m<limit1&&k<*returnSize;m++)
            {
                answer[k]=matrix[i][m];
                k+=1;
            }
            j=m-1;
            flag=1;
            limit1-=1;
        }
        else if(flag==1)
        {
            for(m=i+1;m<limit2&&k<*returnSize;m++)
            {
               answer[k]=matrix[m][j];
               k+=1;
            }
            i=m-1;
            flag=2;
            limit2-=1;
        }
        else if(flag==2)
        {
            for(m=j-1;m>=limit3;m--)
            {
                answer[k]=matrix[i][m];
                 k+=1;
            }
            j=m+1;
            flag=3;
            limit3+=1;
        }
        else{
            for(m=i-1;m>=limit4&&k<*returnSize;m--)
            {
                 answer[k]=matrix[m][j];
                 k+=1;
            }
            i=m+1;
            j+=1;
            flag=0;
            limit4+=1;
        }
    }
    return answer;
}

在这里插入图片描述在这里插入图片描述和上一题思路基本一致

int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
    int** answer=(int**)malloc(sizeof(int*)*n);
    if(n==0)
    {
        *returnSize=0;
        return answer;
    }
    int i=0;
    int j=0;
    int k=0;
    int flag=0;
    int limit1=n;
    int limit2=n;
    int limit3=0;
    int limit4=1;
    int m=0;
    *returnSize=n*n;;
     for(i=0;i<n;i++)
        answer[i]=(int*)malloc(sizeof(int)*n);
    i=0;
    while(k<*returnSize)
    {
        if(flag==0)
        {
            for(m=j;m<limit1&&k<*returnSize;m++)
            {
                answer[i][m]=k+1;
                k+=1;
            }
            j=m-1;
            flag=1;
            limit1-=1;
        }
        else if(flag==1)
        {
            for(m=i+1;m<limit2&&k<*returnSize;m++)
            {
               answer[m][j]=k+1;
               k+=1;
            }
            i=m-1;
            flag=2;
            limit2-=1;
        }
        else if(flag==2)
        {
            for(m=j-1;m>=limit3;m--)
            {
                answer[i][m]=k+1;
                 k+=1;
            }
            j=m+1;
            flag=3;
            limit3+=1;
        }
        else{
            for(m=i-1;m>=limit4&&k<*returnSize;m--)
            {
                 answer[m][j]=k+1;
                 k+=1;
            }
            i=m+1;
            j+=1;
            flag=0;
            limit4+=1;
        }
    }
     *returnColumnSizes = (int *)malloc(n*sizeof(int));        
      for (i=0; i<n; i++)
            (*returnColumnSizes)[i] = n;
    *returnSize=n;
    return answer;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值