这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战。
两个数组的交集 II
题目
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
方法一 「错误」
思路:
根据数组 nums2 创建一个 Set 对象,然后在数组 nums1 上使用 Array.filter() 方法,只保留数组 nums2 中也包含的值。
代码:
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
const s = new Set(nums2);
return nums1.filter(x => s.has(x));
};
结果:
- 执行结果: 解答错误
- 在入参为
([1,2,2,1], [2])时,预期结果为[2]实际结果为[2,2] - 此方法对
nums2进行了去重,没有对nums1去重,在nums1中有重复元素时有缺陷
方法二
思路:
循环 nums1 和 nums2,若 nums1[i] 和 nums2[j] 相同,则将元素的值放入结果数组 res 中,并将对应的 nums1 中 i 位置的元素替换为 '111',nums2 中 j 位置的元素替换为 '222'。
代码:
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
const res = []
const len1 = nums1.length
const len2 = nums2.length
for(let i=0; i<len1; i++) {
for(let j=0; j<len2; j++) {
if(nums1[i] === nums2[j]) {
res.push(nums1[i])
nums1.splice(i,1, '111')
nums2.splice(j,1, '222')
}
}
}
return res
};
结果:
- 执行结果: 通过
- 执行用时:80 ms, 在所有 JavaScript 提交中击败了44.48%的用户
- 内存消耗:41.1 MB, 在所有 JavaScript 提交中击败了13.25%的用户
- 通过测试用例:56 / 56
题目
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 1:
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
解题方法
思路:
- 记录「今天之前买入的最小值」
- 计算「今天卖出的最大获利」
- 比较「每天的最大获利」,取最大值
代码:
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
if(prices.length <= 1) {
return 0
}
let min = prices[0]
let max = 0
for(let i=1;i<prices.length;i++) {
max = Math.max(max, prices[i] - min)
min = Math.min(min, prices[i])
}
return max
};
结果:
- 执行结果: 通过
- 执行用时:88 ms, 在所有 JavaScript 提交中击败了82.61%的用户
- 内存消耗:49.1 MB, 在所有 JavaScript 提交中击败了25.91%的用户
- 通过测试用例:209 / 209