[解题报告]《算法零基础100讲》(第3讲) 矩阵(2)

简介: [解题报告]《算法零基础100讲》(第3讲) 矩阵(2)

867. 转置矩阵

867. 转置矩阵


给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。

矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。


解题思路


直接进行交换赋值就好了。需要注意的是因为行列可能不同所以需要新申请空间。


int** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes){
    int m = matrixSize,n = *matrixColSize;
    int **ans = malloc(sizeof(int *) * n);
    *returnSize = n;
    *returnColumnSizes = malloc(sizeof(int) * (*returnSize));
    for(int i = 0; i < *matrixColSize; ++i){
        ans[i] = malloc(sizeof(int) * m);
        (*returnColumnSizes)[i] = matrixSize;
    }
    for(int i = 0; i < matrixSize; ++i)
        for(int j = 0;j < *matrixColSize; ++j)
            ans[j][i] = matrix[i][j];
    return ans;
}


2022. 将一维数组转变成二维数组

2022. 将一维数组转变成二维数组


给你一个下标从 0 开始的一维整数数组 original 和两个整数 m 和 n 。你需要使用 original 中 所有 元素创建一个 m 行 n 列的二维数组。

original 中下标从 0 到 n - 1 (都 包含 )的元素构成二维数组的第一行,下标从 n 到 2 * n - 1 (都 包含 )的元素构成二维数组的第二行,依此类推。

请你根据上述过程返回一个 m x n 的二维数组。如果无法构成这样的二维数组,请你返回一个空的二维数组。


解题思路


如果一开始达不到就直接返回空,然后一点点开始赋值就好了。


int** construct2DArray(int* original, int originalSize, int m, int n, int* returnSize, int** returnColumnSizes){
    if(originalSize != m*n ){
        *returnSize = 0;
        return NULL;
    }
    int ** ans = malloc(sizeof(int *) * m);
    *returnSize = m;
    *returnColumnSizes = malloc(sizeof(int) * m);
    for(int i = 0; i < m; ++i){
        ans[i] = malloc(sizeof(int) *n);
        (*returnColumnSizes)[i] = n;
    }
    for(int i = 0;i < m; ++i)
        for(int j  = 0; j < n; ++j)
            ans[i][j] = original[i*n + j];
    return ans;
}


1886. 判断矩阵经轮转后是否一致

1886. 判断矩阵经轮转后是否一致


给你两个大小为 n x n 的二进制矩阵 mat 和 target 。现 以 90 度顺时针轮转 矩阵 mat 中的元素 若干次 ,如果能够使 mat 与 target 一致,返回 true ;否则,返回 false 。


解题思路


旋转判断就好了。判断转一圈(4次)是否能重合


bool findRotation(int** mat, int matSize, int* matColSize, int** target, int targetSize, int* targetColSize){
    if(targetSize != matSize || *targetColSize != *matColSize)  return false;
    int n = 4;
    bool flag = true;
    while(n--){
        flag = true;
        //旋转矩阵
        //转置矩阵
        for(int i = 0;i < matSize; ++i)
            for(int j = i + 1; j < matColSize[i]; j++){
                mat[i][j] = mat[i][j] ^ mat[j][i];
                mat[j][i] = mat[i][j] ^ mat[j][i];
                mat[i][j] = mat[i][j] ^ mat[j][i];
            }
        //垂直翻转
        for(int i = 0;i < matSize; ++i)
            for(int j = 0; j < *matColSize / 2; j++){
                mat[i][j] = mat[i][j] ^ mat[i][ *matColSize - 1 -j];
                mat[i][*matColSize - 1 -j] = mat[i][j] ^ mat[i][ *matColSize - 1 -j];
                mat[i][j] = mat[i][j] ^ mat[i][ *matColSize - 1 -j];
            }
        for(int i = 0;i < matSize; ++i)
            for(int j = 0; j < matColSize[i]; j++)
                if(mat[i][j] != target[i][j]) flag = false;
        if(flag)    return true;
    }
    return false;
}


1260. 二维网格迁移

1260. 二维网格迁移


给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。

每次「迁移」操作将会引发下述活动:


位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。

位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。

位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。

请你返回 k 次迁移操作后最终得到的 二维网格。


解题思路


按照要求做修改就好了。


int** shiftGrid(int** grid, int gridSize, int* gridColSize, int k, int* returnSize, int** returnColumnSizes){
    //处理返回值
    int m = gridSize, n = *gridColSize,temp[m];
    *returnSize = m;
    *returnColumnSizes = malloc(sizeof(int) * m);
    for(int i = 0; i< m; ++i) (*returnColumnSizes)[i] = n;
    while(k--){
        //执行操作
        for(int i = 0; i < m;++i){
            temp[i] = grid[i][n - 1];
            for(int j = n-1; j > 0; --j)
                grid[i][j] = grid[i][j -1];
        }
        grid[0][0] = temp[m-1];
        for(int i = 1; i < m;++i) grid[i][0] = temp[i-1];
    }
    return grid;
}


54. 螺旋矩阵

54. 螺旋矩阵


给你一个m行n列的矩阵matrix,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。


解题思路


可以一圈一圈输出0.0


int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
    int *ans = malloc(sizeof(int) * 100),ansnum = 0;
    int top = 0, bottom = matrixSize - 1, left = 0, right = matrixColSize[0] - 1;
    while(top <= bottom && left <= right){
        for(int i = left;i <= right;i++)
            ans[ansnum++] = matrix[top][i];
        for(int i = top + 1;i <= bottom;i++)
            ans[ansnum++] = matrix[i][right];
        if(bottom > top)
            for(int i = right - 1;i >= left;i--)
                ans[ansnum++] = matrix[bottom][i];
        if(right > left)
            for(int i = bottom - 1; i >= top + 1;i--)
                ans[ansnum++] = matrix[i][left];
        top++,left++;
        bottom--,right--;
    }
    *returnSize = ansnum;
    return ans;
}



相关文章
|
18小时前
|
算法
|
2月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
2月前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
45 4
|
2月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
119 0
|
2月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
168 0
|
2月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
|
4月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
57 6
|
6月前
|
机器学习/深度学习 数据采集 人工智能
算法金 | 协方差、方差、标准差、协方差矩阵
**摘要:** 本文介绍了统计学中的基础概念,包括方差、标准差、协方差及其矩阵。方差衡量数据的分散程度,标准差是方差的平方根,提供相同单位下的波动度量。协方差则分析两个变量的关联性,正负值表示正负相关。协方差矩阵扩展到多变量情况,展示多个变量间的关系。这些工具在金融、质量控制、机器学习等领域有广泛应用。文章通过实例和公式清晰解释了每个概念,并强调理解它们之间的关系对于数据分析和统计建模的重要性。
82 0
算法金 | 协方差、方差、标准差、协方差矩阵
|
6月前
|
算法 C语言
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
44 2
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值