乘积最大子数组(题号152)
题目
给你一个整数数组 nums
,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
链接
解释
这题实在想不出答案了,不知道是数学底子太差还是脑子不够用,确实没想到这种解法,完全没有任何想法啊。
其实逻辑比较简单,只需要一个变量来记录乘积的最大值,一个变量来记录乘积的最小值,每次循环的时候需要四个变量,先给最大值乘上当前数字,再给最小值乘上当前数字,最后取当前数字和两次乘积的最大值和最小值并赋值给max
和min
即可。
说可能说不清楚,看眼代码就清楚了。
自己的答案
无
更好的方法
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
链接
解释
这题本应该按照动态规划的步骤来一步步进行求解,奈何没想到这期间的具体步骤,直接想出了答案,其实应该按照步骤一步步来的,这样可以锻炼在复杂情况下的解体能力。
这题其实就需要两个变量来存储状态,也就是记忆化。
第一个变量叫它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:想查看往期文章和题目可以点击下面的链接:
这里是按照日期分类的👇
经过有些朋友的提醒,感觉也应该按照题型分类
这里是按照题型分类的👇
有兴趣的也可以看看我的个人主页👇