数据结构刷题:第四天

简介: 数据结构刷题:第四天

一,重塑矩阵


566. 重塑矩阵 - 力扣(LeetCode)

https://leetcode.cn/problems/reshape-the-matrix/

bf3abf9bbf0c4ac4b98333e8eb5f6664.png


思路与算法


对于一个行数为m,列数为n,行列下标都从0开始编号的二维数组,我们可以通过下面的方式,将其中的每个元素(i, j)映射到整数域内,并且它们按照行优先的顺序一-对应着 [0, mn)中的每一个整数。形象化地来说,我们把这个二维数组「排扁」成了一个-维数组。如果读者对机器学习有一定了解,可以知道这就是flatten操作。


这样的映射即为:

                       (i,j)→i*n+j


同样地,我们可以将整数x映射回其在矩阵中的下标,即

               i=x/n

               j=x%n


其中/表示整数除法,%示取模运算。


那么题目需要我们做的事情相当于:

●将二维数组nums映射成一 个一维数组;

●将这个一维数组映射回r行c列的二维数组。


我们当然可以直接使用一个一维数组进行过渡,但我们也可以直接从二维数组nums 得到r行c列的

重塑矩阵:

●设nums本身为m行n列,如果mn≠rc,那么二包含的元素个数不相同,因此无法进行重

塑;

●否则,对于x∈[0,mn), 第x个元素在nums中对应的下标为(x / n,x % n),而在新的重塑矩

阵中对应的下标为(x/ c,x % c)。我们直接进行赋值即可。


class Solution {
public:
    vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
        int m = nums.size();
        int n = nums[0].size();
        if (m * n != r * c) {
            return nums;
        }
        vector<vector<int>> ans(r, vector<int>(c));
        for (int x = 0; x < m * n; ++x) {
            ans[x / c][x % c] = nums[x / n][x % n];
        }
        return ans;
    }
};


复杂度分析


●时间复杂度: O(rc)。 这里的时间复杂度是在重塑矩阵成功的前提下的时间复杂度,否则当mn≠rc时, C++语言中返回的是原数组的一份拷贝,本质上需要的时间复杂度为O(mn),而期语可以直接返回原数组的对象,需要的时间复杂度仅为0(1)。

●空间复杂度: 0(1)。 这里的空间复杂度不包含返回的重塑矩阵需要的空间。


二,杨辉三角


118. 杨辉三角 - 力扣(LeetCode)

https://leetcode.cn/problems/pascals-triangle/

409f6ac8da8144ec8f57a74c5a7a1733.png


思路及解法


杨辉三角,是二项式系数在三角形中的一种几何排列。它是中国古代数学的杰出研究成果之一,它把二项赋系数图形化,把组合数内在的- -些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。


杨辉三角具有以下性质:


bc6dba11fe2a4c96a267355eb9a959f1.png


class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> ret(numRows);
        for (int i = 0; i < numRows; ++i) {
            ret[i].resize(i + 1);//每行的列表大小不同,需要加1
            ret[i][0] = ret[i][i] = 1;
            for (int j = 1; j < i; ++j) {
                ret[i][j] = ret[i - 1][j] + ret[i - 1][j - 1];
            }
        }
        return ret;
    }
};


复杂度分析


  • 时间复杂度:O(numRows2)。


  • 空间复杂度:O(1)。不考虑返回值的空间占用。
目录
相关文章
|
6天前
|
存储 算法 调度
数据结构期末复习(3)栈和队列
数据结构期末复习(3)栈和队列
21 0
|
6天前
|
自然语言处理 数据安全/隐私保护
【数据结构入门精讲 | 第十五篇】散列表知识点及考研408、企业面试练习(2)
【数据结构入门精讲 | 第十五篇】散列表知识点及考研408、企业面试练习(2)
26 0
|
6天前
|
存储 缓存 索引
【数据结构入门精讲 | 第十四篇】散列表知识点及考研408、企业面试练习(1)
【数据结构入门精讲 | 第十四篇】散列表知识点及考研408、企业面试练习(1)
32 0
|
9月前
|
存储 人工智能 搜索推荐
排序算法——参考《王道考研》+《大话数据结构》
排序算法——参考《王道考研》+《大话数据结构》
87 0
|
算法
数据结构刷题:第五天
具体地,我们首先遍历该数组一次,如果某个元素为 0,那么就将该元素所在的行和列所对应标记数组的位置置为 true。最后我们再次遍历该数组,用标记数组更新原数组即可。
58 0
数据结构刷题:第五天
|
存储 算法 JavaScript
数据结构刷题:第六天
在第一次遍历时,我们使用哈希映射统计出字符串中每个字符出现的次数。在第二次遍历时,我们只要遍历到了一个只出现一次的字符,那么就返回它的索引,否则在遍历结束后返回 −1。
86 0
数据结构刷题:第六天
|
存储 算法
数据结构刷题:第七天
具体地,我们可以使用哈希表来存储所有已经访问过的节点。每次我们到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。重复这一过程,直到我们遍历完整个链表即可。
70 0
数据结构刷题:第七天
|
存储 C++
数据结构刷题:第三天
由于同一个数字在两个数组中都可能出现多次,因此需要用哈希表存储每个数字出现的次数。对于一个数字,其在交集中出现的次数等于该数字在两个数组中出现次数的最小值。
70 0
数据结构刷题:第三天
|
机器学习/深度学习 存储 算法
数据结构刷题:第八天
当我们遍历到链表的最后一个节点时,cur.next 为空节点,如果不加以判断,访问 cur.next 对应的元素会产生运行错误。因此我们只需要遍历到链表的最后一个节点,而不需要遍历完整个链表。
67 0
数据结构刷题:第八天
|
存储
数据结构刷题:第九天
当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是相同的类型,或者栈中并没有左括号,那么字符串 s 无效,返回False。为了快速判断括号的类型,我们可以使用哈希表存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。
61 0
数据结构刷题:第九天