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;
}
相关文章
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 04. 二维数组中的查找
剑指Offer题目 "二维数组中的查找" 的Python解决方案,包括非递归迭代、递归以及使用内置函数的二分查找方法,以判断一个有序的二维数组中是否含有给定整数。
38 1
|
4月前
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
|
2月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
2月前
|
机器学习/深度学习
Leetcode第48题(旋转图像)
这篇文章介绍了LeetCode第48题“旋转图像”的解题方法,通过原地修改二维矩阵实现图像的顺时针旋转90度。
29 0
Leetcode第48题(旋转图像)
|
2月前
|
存储 编译器 C语言
【C语言】数组(一维、二维数组的简单介绍)
【C语言】数组(一维、二维数组的简单介绍)
|
2月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
17 0
|
3月前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
3月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
3月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第六章 数组_一维数组_二维数组_字符数组详解
本章介绍了C语言中的数组概念及应用。数组是一种存储同一类型数据的线性结构,通过下标访问元素。一维数组定义需指定长度,如`int a[10]`,并遵循命名规则。数组元素初始化可使用 `{}`,多余初值补0,少则随机。二维数组扩展了维度,定义形式为`int a[3][4]`,按行优先顺序存储。字符数组用于存储字符串,初始化时需添加结束符`\0`。此外,介绍了字符串处理函数,如`strcat()`、`strcpy()`、`strcmp()` 和 `strlen()`,用于拼接、复制、比较和计算字符串长度。
|
4月前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历