数据结构入门数组篇(二)

350. 两个数组的交集 II

  给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

  示例:输入:nums1 = [1,2,2,1], nums2 = [2,2],输出:[2,2]。

  第一种解法:「本质上判断另一个数是否存在,那么可以先用哈希表记录一个数组的元素个数情况,再遍历另一个数组即可」

  时间复杂度:O(max(m, n)),空间复杂度:O(m+n)。

const intersect = (nums1, nums2) => {
  const record = new Map();
  for (let i = 0; i < nums1.length; i++) {
    const item = nums1[i];
    if (!record.has(item)) {
      record.set(item, 0);
    }
    record.set(item, record.get(item) + 1);
  }

  const ans = [];

  for (let i = 0; i < nums2.length; i++) {
    const item = nums2[i];
    if (record.get(item) > 0) {
      record.set(item, record.get(item) - 1);
      ans.push(item);
    }
  }

  return ans;
}

  第二种解法:「可以先将两个数组进行排序,然后利用双指针进行相等元素的归并处理」

  时间复杂度:O(min(mlogm, nlogn)),空间复杂度:O(n+m)。

const intersect = (nums1, nums2) => {
    nums1.sort((a, b) => a - b);
    nums2.sort((a, b) => a - b);
    
    const maxLen1 = nums1.length;
    const maxLen2 = nums2.length;

    let p1 = 0;
    let p2 = 0;

    const ans = [];

    while (p1 < maxLen1 || p2 < maxLen2) {
        const num1 = nums1[p1];
        const num2 = nums2[p2];

        if (num1 < num2) {
            p1++;
        } else if (num1 > num2) {
            p2++;
        } else if (num1 === num2) {
            ans.push(num1);
            p1++;
            p2++;
        } else {
            p1++;
            p2++;
        }
    }

    return ans;
}

121. 买卖股票的最佳时机

  给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

  你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。

  返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

  示例:输入:[7,1,5,3,6,4],输出:5。

  解题思路:「这是一道典型的动态规划题目,设 F(i) 表示第i天最大的收益,那么 F(i) = prices[i] - min(prices[0...i-1])」

  时间复杂度:O(n),空间复杂度:O(1)。

const maxProfit = function(prices) {
    let ans = 0;
    let selectPrice = prices[0];
    for (let i = 1; i < prices.length; i++) {
        ans = Math.max(ans, prices[i] - selectPrice);
        if (selectPrice > prices[i]) {
            selectPrice = prices[i];
        }
    }

    return ans;
};

566. 重塑矩阵

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

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

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

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

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

  解题思路:「二维数组遍历」

  时间复杂度:O(mn),空间复杂度:O(rc)。

const matrixReshape = (num, r, c) => {
  const result = []
  const row = num.length
  const col = num[0].length
  let temp = []
  for (let i = 0; i < row; i++) {
    for (let j = 0; j < col; j++) {
      const index = i * col + j + 1
      temp.push(num[i][j])
      if (index % c === 0) {
        result.push(temp.map(item => item))
        temp = []
        r--
        if (r === 0 && i === row - 1 && j === col - 1) {
          return result
        }
      }
    }
  }
  if (r !== 0) {
    return num
  }
  return result
}

118. 杨辉三角

  给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。

  在「杨辉三角」中,每个数是它左上方和右上方的数的和。

  示例:输入: numRows = 5,输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]。

  解题思路:「二维数组遍历」

  时间复杂度:O(numRows^2),空间复杂度:O(1)。

const generate = function(numRows) {
  const ans = [];

  for (let i = 0; i < numRows; i++) {
      const row = new Array(i + 1).fill(1);
      for (let j = 1; j < row.length - 1; j++) {
          row[j] = ans[i - 1][j - 1] + ans[i - 1][j];
      }
      ans.push(row);
  }
  return ans;
};

五、写在最后

  「如果本文对您有帮助,欢迎点赞、分享、或者关注微信公众号《漫谈大前端》。」

da432fd50bf837ff86dfdb0ee4c6583d.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值