题目:
152. 乘积最大子数组
https://leetcode-cn.com/problems/maximum-product-subarray/
注意的地方:
错误代码:
class Solution {
public int maxProduct(int[] nums) {
int n = nums.length;
int max[] = new int[n];
int min[] = new int[n];
max[0] = nums[0];
min[0] =nums[0];
if (nums.length==1){
return nums[0];
}
int res = Integer.MIN_VALUE;
for (int i=1;i<nums.length;i++){
max[i] = Math.max(nums[i],nums[i]*max[i-1]);
max[i] = Math.max(max[i],nums[i]*min[i-1]);
min[i] = Math.min(nums[i],min[i-1]*nums[i]);
min[i] = Math.min(min[i],max[i-1]*nums[i]);
res = Math.max(res,max[i]);
}
return res;
}
}
当输入用例是[2,-1,1,1]时,第一个数时最大的,代码里这样的写法,很容易会忽略第一个值。
正确的写法
class Solution {
public int maxProduct(int[] nums) {
int n = nums.length;
int max[] = new int[n];
int min[] = new int[n];
max[0] = nums[0];
min[0] =nums[0];
if (nums.length==1){
return nums[0];
}
int res = nums[0];
for (int i=1;i<nums.length;i++){
max[i] = Math.max(nums[i],nums[i]*max[i-1]);
max[i] = Math.max(max[i],nums[i]*min[i-1]);
min[i] = Math.min(nums[i],min[i-1]*nums[i]);
min[i] = Math.min(min[i],max[i-1]*nums[i]);
res = Math.max(res,max[i]);
}
return res;
}
}
这里要么在设置res初始值时格外注意,要么就把第一个元素的情况也移到循环里进行处理,避免遗漏;
这个点很容易被忽略,出错了也不容易查
题目:98. 验证二叉搜索树
答案的解法很好,值得参考