前端刷题路-Day23

219 阅读1分钟

乘积最大子数组(题号152)

题目

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

示例 1:

输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

链接

leetcode-cn.com/problems/ma…

解释

这题实在想不出答案了,不知道是数学底子太差还是脑子不够用,确实没想到这种解法,完全没有任何想法啊。

其实逻辑比较简单,只需要一个变量来记录乘积的最大值,一个变量来记录乘积的最小值,每次循环的时候需要四个变量,先给最大值乘上当前数字,再给最小值乘上当前数字,最后取当前数字和两次乘积的最大值和最小值并赋值给maxmin即可。

说可能说不清楚,看眼代码就清楚了。

自己的答案

更好的方法

var maxProduct = function(nums) {
  var res = nums[0]
      max = res
      min = res
      tmp1 = 0
      tmp2 = 0
  for (let i = 1; i < nums.length; i++) {
    tmp1 = max * nums[i]    
    tmp2 = min * nums[i]
    max = Math.max(tmp1, tmp2, nums[i])
    min = Math.min(tmp1, tmp2, nums[i])
    res = Math.max(max, res)
  }
  return res
};

看吧,其实很简单,只是自己没弄清楚动态规划的方程导致一脸懵逼。

买卖股票的最佳时机(题号121)

题目

给定一个数组 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。

提示:

  • 1 <= prices.length <= 105
  • 0 <= prices[i] <= 104

链接

leetcode-cn.com/problems/be…

解释

这题本应该按照动态规划的步骤来一步步进行求解,奈何没想到这期间的具体步骤,直接想出了答案,其实应该按照步骤一步步来的,这样可以锻炼在复杂情况下的解体能力。

这题其实就需要两个变量来存储状态,也就是记忆化。

第一个变量叫它min,也就是最小值,最开始赋值为数组的第一个值,在遍历数组的时候每次都会进行比较,看看是当前元素小还是min小,取较小的那个赋值给min

第二个变量叫res,也就是最后的结果,每次遍历的时候那当前元素减去min的差和当前res进行对比,取较大值。res的初始值为0,这也是题目规定的,这也意味着数组是从大到小排列的。

自己的答案

var maxProfit = function(prices) {
  var min = prices[0]
      res = 0
  for (let i = 1; i < prices.length; i++) {
    min = Math.min(min, prices[i])
    res = Math.max(prices[i] - min, res)
  }
  return res
};

简单明了,不多赘述。

更好的方法



PS:想查看往期文章和题目可以点击下面的链接:

这里是按照日期分类的👇

前端刷题路-目录(日期分类)

经过有些朋友的提醒,感觉也应该按照题型分类
这里是按照题型分类的👇

前端刷题路-目录(题型分类)

有兴趣的也可以看看我的个人主页👇

Here is RZ