LeetCode二维数组例题(原地旋转和对角线遍历)-c语言

简介: LeetCode二维数组例题(原地旋转和对角线遍历)-c语言

二维数组 矩阵旋转(原地旋转)


606ca6285731415e9005c2c9316f0d4d.png

**方法一:**四个角是一个循环,引申到四个块是循环

n为偶数时,枚举n2/4个位置

29ad0a5e9e9a41ccbda08c6eb8b78b50.png

n为奇数时,枚举(n2-1)/4个位置

6529dfaed9ce4e0697147301abc45c35.png

void rotate(int** matrix, int matrixSize, int* matrixColSize) {
    for (int i = 0; i < matrixSize / 2; ++i) {
        for (int j = 0; j < (matrixSize + 1) / 2; ++j) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[matrixSize - j - 1][i];
            matrix[matrixSize - j - 1][i] = matrix[matrixSize - i - 1][matrixSize - j - 1];
            matrix[matrixSize - i - 1][matrixSize - j - 1] = matrix[j][matrixSize - i - 1];
            matrix[j][matrixSize - i - 1] = temp;
        }
    }
}

方法二先竖直翻转,再逆对角线翻转

//c语言没有swap函数 要手写
void swap(int *a,int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
void rotate(int** matrix, int matrixSize, int* matrixColSize){
    for(int i = 0;i < matrixSize;i++)
    {
        for(int j = 0;j < matrixSize/2;j++)
        {
            swap(&matrix[i][j],&matrix[i][matrixSize-j-1]);//这里传的是取地址符
        }
    }
    for(int i = 0;i < matrixSize-1;i++)
    {
        for(int j = 0;j < matrixSize-i;j++)//注意两个for循环条件
        {
            swap(&matrix[i][j],&matrix[matrixSize-j-1][matrixSize-i-1]);
        }
    }    
}


对角线遍历


9c16a4aed50e4aa882b38ce62d2fd5af.png

当下标和为偶数时向右上遍历,当下标和为奇数时向左下遍历(我的代码中从0开始遍历)

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findDiagonalOrder(int** mat, int matSize, int* matColSize, int* returnSize){
    if(matSize == 0){    //矩阵为空,返回0
        *returnSize = 0;
        return 0;
    }
    int arr = matSize*(*matColSize);
    int brr = matSize+(*matColSize)-1;
    printf("%d",brr);
    int* result = (int*)malloc(sizeof(int) * arr);
    int i,j;
    *returnSize = 0;
    for(int k = 0;k < brr;k++)
    {
        printf("%d",k);
        if(k % 2 == 0)
        {
            for(j = 0;j < *matColSize;j++)
            {
                if(k - j < 0)
                {
                    break;
                }
                if(k - j >= matSize)
                {
                    continue;
                }
                result[(*returnSize)] = mat[k-j][j];
                (*returnSize)++;
            }
        }
        else
        {
            for(i = 0;i < matSize;i++)
            {   
                if(k - i < 0)
                {
                    break;
                }
                if(k - i >= (*matColSize))
                {
                    continue;
                }
                result[(*returnSize)] = mat[i][k-i];
                (*returnSize)++;
            }
        }
    }
    return result;
}//时间较长
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findDiagonalOrder(int** mat, int matSize, int* matColSize, int* returnSize){
    if(matSize == 0)
    {                                       //矩阵为空,返回0
        *returnSize = 0;
        return 0;
    }
    *returnSize = matSize * (*matColSize);
    int* ans = (int*)malloc(sizeof(int) * (*returnSize));
    int i=0, j=0, n=0;
    while(n < (*returnSize))
    {                               //循环遍历矩阵
        ans[n] = mat[i][j];                                
        if((i + j) % 2 == 0)
        {                               //下标和为偶数,向右上遍历
            if(j < (*matColSize)-1){
                j++;
                if(i > 0)                                   //边界情况
                    i--;
            }
            else                                           //边界情况
                i++;
        }
        else
        {                                              //下标和为奇数,向左下遍历
            if(i < matSize-1)
            {
                i++;
                if(j > 0)                                   //边界情况
                    j--;
            }
            else                                           //边界情况
                j++;
        }
        n++;
    }
    return ans;
}
相关文章
|
1天前
|
存储 数据处理 C语言
C语言二维数组
C语言二维数组
17 0
|
1天前
|
C语言
【C语言】利用数组处理批量数据(一维数组和二维数组)
【C语言】利用数组处理批量数据(一维数组和二维数组)
|
1天前
|
机器学习/深度学习
leetcode代码记录(旋转图像
leetcode代码记录(旋转图像
9 0
|
1天前
leetcode代码记录(对称二叉树 中序遍历+回文串 为什么不行
leetcode代码记录(对称二叉树 中序遍历+回文串 为什么不行
8 0
|
1天前
|
算法
leetcode代码记录(二叉树递归遍历
leetcode代码记录(二叉树递归遍历
8 0
|
1天前
|
存储 算法 C语言
C语言刷题~Leetcode与牛客网简单题
C语言刷题~Leetcode与牛客网简单题
|
1天前
|
存储 编译器 数据处理
C语言中二维数组的初始化
C语言中二维数组的初始化
17 0
|
1天前
|
算法 API DataX
二叉树(下)+Leetcode每日一题——“数据结构与算法”“对称二叉树”“另一棵树的子树”“二叉树的前中后序遍历”
二叉树(下)+Leetcode每日一题——“数据结构与算法”“对称二叉树”“另一棵树的子树”“二叉树的前中后序遍历”
|
1天前
|
算法
【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历
【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历
|
1天前
|
存储 C语言
【C语言】Leetcode 88.合并两个有序数组
【C语言】Leetcode 88.合并两个有序数组
16 3