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

105 阅读3分钟

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

两个数组的交集 II

原题地址

题目

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

示例 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 中有重复元素时有缺陷

方法二

思路: 循环 nums1nums2,若 nums1[i]nums2[j] 相同,则将元素的值放入结果数组 res 中,并将对应的 nums1i 位置的元素替换为 '111'nums2j 位置的元素替换为 '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

— END