建站公司哪个平台最好app的技术框架有哪些
建站公司哪个平台最好,app的技术框架有哪些,网站推广软件哪个最实惠,怎样管理网站152. 乘积最大子数组
中等
给你一个整数数组 nums #xff0c;请你找出数组中乘积最大的非空连续 子数组#xff08;该子数组中至少包含一个数字#xff09;#xff0c;并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。 示例 1:
输入: nums [2,3,-2,4…152. 乘积最大子数组中等给你一个整数数组nums请你找出数组中乘积最大的非空连续 子数组该子数组中至少包含一个数字并返回该子数组所对应的乘积。测试用例的答案是一个32-位整数。示例 1:输入: nums [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: nums [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。提示:1 nums.length 2 * 104-10 nums[i] 10nums的任何子数组的乘积都保证是一个32-位整数 核心笔记乘积最大子数组 (Maximum Product Subarray)1. 核心思想 (一句话总结)“双面间谍策略同时维护‘最大值’和‘最小值’因为当前的‘最小值’负数乘以一个负数可能立马翻身变成‘最大值’。”状态定义fMax以当前位置结尾的最大乘积。fMin以当前位置结尾的最小乘积为了等待下一个负数来实现逆袭。转移方程由于负数的存在最大值可能来自fMax * x正数 正数fMin * x负数 负数 变成大正数x本身前面的积累太烂了不如从头开始相当于 Kadane 中的 restart。2. 算法流程 (DP 滚动数组)初始化 (Init)ans设为MIN_VALUE或nums[0]因为结果可能是负数。fMax和fMin初始化为 1作为乘法的单位元或者配合循环内的逻辑第一次遇到x时会自动变成x。遍历 (Loop)计算三个候选值fMax * x,fMin * x,x。暂存 (Temp)因为fMax会先被更新所以计算fMin时需要用到更新前的fMax必须用变量mx暂存。更新 (Update)fMax取三个候选中的最大值。fMin取三个候选中的最小值。记录 (Record)每次循环更新全局最大值ans。 代码回忆清单// 题目LC 152. Maximum Product Subarray class Solution { public int maxProduct(int[] nums) { int ans Integer.MIN_VALUE; // 注意结果可能是负数不能设为 0 int fMax 1; int fMin 1; for (int x : nums) { // 1. 暂存旧的 fMax // 因为下面马上要更新 fMax而计算 fMin 需要用到旧的 fMax int mx fMax; // 2. 核心转移在 (最大积*x, 最小积*x, x本身) 中找最大值 // 包含 x 意味着如果前面的积是 0 或很小的负数不如从当前 x 重新开始 fMax Math.max(Math.max(fMax * x, fMin * x), x); // 3. 维护最小值为了应对可能的负负得正 // 注意这里用的是 mx (旧的 fMax) fMin Math.min(Math.min(mx * x, fMin * x), x); // 4. 更新全局答案 ans Math.max(ans, fMax); } return ans; } }⚡ 快速复习 CheckList (易错点)[ ]为什么要维护fMin如果输入是[-2, 3, -4]。走到3时fMax是 3fMin是 -6。走到-4时3 * -4 -12但-6 * -4 24。如果没有维护fMin就会漏掉 24 这个解。[ ]为什么要暂存mx在计算fMin的时候公式里需要old_fMax * x。但上一行代码已经把fMax更新了。如果不暂存就会用新的fMax去算fMin导致逻辑错误。[ ]fMax和fMin初始值设为 1 安全吗对于这种写法是安全的。假设数组是[-2, ...]。第一轮循环max(1*-2, 1*-2, -2)结果是 -2。它利用了Math.max(..., x)这一项确保了第一个元素会被正确处理相当于从第一个元素强制 Restart。️ 数字演练nums [2, 3, -2, 4]Init:ans MIN,fMax 1,fMin 1.x 2:mx 1.fMax max(2, 2, 2) 2.fMin min(2, 2, 2) 2.ans 2.x 3:mx 2.fMax max(6, 6, 3) 6. (延续前面的)fMin min(6, 6, 3) 3.ans 6.x -2(关键转折):mx 6.fMax max(-12, -6, -2) -2. (最大值变成了负数或者选择重开)fMin min(-12, -6, -2) -12. (埋下伏笔保留了一个很大的负数)ans 6.x 4:mx -2.fMax max(-8, -48, 4) 4. (因为之前的 fMin 乘 4 还是负数所以不如从 4 重开)fMin min(-8, -48, 4) -48.ans 6.Result: 6.(注如果数组是[2, 3, -2, -4]最后一步fMax会变成max(-2*-4, -12*-4, -4) 48体现fMin的作用)