https://www.nowcoder.com/practice/9c158345c867466293fc413cff570356?tpId=188&&tqId=36848&rp=1&ru=/ta/job-code-high-week&qru=/ta/job-code-high-week/question-ranking
题目描述
给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。
示例1
输入
[-2.5,4,0,3,0.5,8,-1]
返回值
12.00000
分析:从给出的例子看,要求子数组必须连续。同时由于元素正负性不确定,应同时记录最大最小值
iMax、iMin分别用来记录以前一个数结尾的子数组的最大乘积、最小乘积。
- arr[i]>0: iMax = std::max(arr[i], arr[i]*iMax);
- arr[i]<0: iMax = std::max(arr[i], arr[i]*iMin); // 相当于是负负得正
所以,当arr[i]<0的时候,交换iMax和iMin即可。
public double maxProduct(double[] arr) {
if(null == arr || arr.length == 0){
return 0;
}
// 子数组的含义,看所给例子应该是要连续才可以?
// 表示当前下标值的子数组内,最大的正负值
double max = 1;
double min = 1;
double result = arr[0];
for(int i = 0; i < arr.length; i++){
if(arr[i] < 0){
double temp = min;
min = max;
max = temp;
}
max = Math.max(arr[i], max*arr[i]);
min = Math.min(arr[i],min*arr[i]);
result = Math.max(result,max);
}
return result;
}