首页 > 代码库 > [LeetCode] 最大连续自序列和或者乘积
[LeetCode] 最大连续自序列和或者乘积
题目
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.
思路
其实不管是最大连续自序列和还是乘积,关键的一个概念是定义一个变量叫做 “包含当前值的最大连续序列值(和/乘积)”,举例来说curMax
这个值的存在使得包含下一个位置的最大连续序列值的求解成为可能,以最大连续自序列求和为例,
curMax(x+1) = max(A[x+1], curMax(x) + A[X])
对于最大连续自序列乘积,需要纪录两个,一个是包含当前值的最大连续子序列乘积, 一个是包含当前值的最小自序列乘积
curMax(x + 1) = Math.max(curMax(x)A[x], curMin(x)A[x], A[x])
curMin(x + 1) = Math.min(curMax(x)A[x], curMin(x)A[x], A[x])
因为包含当前值的最大值(最小值)只能由这三种可能构成
代码
最大连续自序列和
public class Solution { public int maxSubArray(int[] A) { int curMax = A[0]; int max = A[0]; for (int i = 1; i < A.length ; i++) { curMax = Math.max(A[i], curMax + A[i]); max = Math.max(max, curMax); } return max; } }
最大连续子序列乘积
public class MaxProductSubArray { public int maxProduct(int[] A) { int curMax = A[0]; int curMin = A[0]; int max = A[0]; for(int i = 1; i < A.length; i++) { // 注意这里先存起来,下面要在更新之后再用一次 int temp = curMax * A[i]; curMax = Math.max(A[i], Math.max(curMax * A[i], curMin * A[i])); curMin = Math.min(A[i], Math.min(temp, curMin * A[i])); max = Math.max(curMax, max); } return max; } }
[LeetCode] 最大连续自序列和或者乘积
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。