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;
};
五、写在最后
「如果本文对您有帮助,欢迎点赞、分享、或者关注微信公众号《漫谈大前端》。」