LeetCode 数据结构入门 day 4 - 数组

95 阅读3分钟

这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

重塑矩阵

原题地址

题目

在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。

给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 rc ,分别表示想要的重构的矩阵的行数和列数。

重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。

如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

示例 1:

输入:mat = [[1,2],[3,4]], r = 1, c = 4
输出:[[1,2,3,4]]

示例 2:

输入:mat = [[1,2],[3,4]], r = 2, c = 4
输出:[[1,2],[3,4]]

方法

思路:

  1. 将给的原始矩阵转换成一维数组;
  2. 判断一维数组的长度跟 r*c 是否相同,若不同,则不满足 reshape 操作的条件,返回原数组;
  3. 遍历一维数组,使用 slice 拷贝 i*ci*c+c 的数组,放到结果数组中。

代码:

/**
 * @param {number[][]} mat
 * @param {number} r
 * @param {number} c
 * @return {number[][]}
 */
var matrixReshape = function(mat, r, c) {
    const originArr = mat.join(',').split(',')
    if(r*c !== originArr.length) return mat
    const res = []
    for(let i =0; i<r;i++) {
        let tmp = originArr.slice(i*c, i*c+c)
        res.push(tmp)
    }
    return res
};

结果:

  • 执行结果: 通过
  • 执行用时:72 ms, 在所有 JavaScript 提交中击败了98.76%的用户
  • 内存消耗:45.3 MB, 在所有 JavaScript 提交中击败了5.09%的用户
  • 通过测试用例:57 / 57

杨辉三角

原题地址

题目

方法一

思路:

  1. 定义一个方法 combination 来根据行列计算对应的数值
  2. 二重循环,计算每一行对应的数组,放入结果数组中

代码:

/**
 * @param {number} numRows
 * @return {number[][]}
 */
function combination(m,n){
    if(n === 0) return 1;//第一个数为1
    else if(m === n) return 1; //最后一个数为1
    else return combination(m-1,n-1) + combination(m-1,n);//中间的数为前一行的两个数相加
}
var generate = function(numRows) {
    const res = []
    for( var i = 0 ; i < numRows ; i++ ){ 
        let arr=[];//用来放第i行的数
        for ( var j = 0 ; j <= i ; j++ ) {
            arr.push(combination(i,j));
        }
        res.push(arr)
    }
    return res
};

结果:

  • 执行结果: 通过
  • 执行用时:8888 ms, 在所有 JavaScript 提交中击败了 7.93% 的用户
  • 内存消耗:41 MB, 在所有 JavaScript 提交中击败了 8.74% 的用户
  • 通过测试用例:14 / 14

方法二

思路:

  1. 二重循环,第一项最后一项为1。
  2. res[i][j] = res[i - 1][j] + res[i - 1][j - 1]

代码:

/**
 * @param {number} numRows
 * @return {number[][]}
 */
var generate = function(numRows) {
    const res = new Array()
    for (let i = 0; i < numRows; i++) {
        res[i] = new Array()
        for (let j = 0; j <= i; j++) {
            if (j === 0 || i === 0 || i === j) {
                res[i][j] = 1
            } else {
                res[i][j] = res[i - 1][j] + res[i - 1][j - 1]
            }
        }
    }
    return res
};

结果:

  • 执行结果: 通过
  • 执行用时:72 ms, 在所有 JavaScript 提交中击败了 98.76% 的用户
  • 内存消耗:45.3 MB, 在所有 JavaScript 提交中击败了 5.09% 的用户
  • 通过测试用例:57 / 57

— END