本文主要是介绍力扣152-乘积最大子数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
可以采用动态规划算法,但这里需要注意的一点就是会存在负负得正得场景。所以要求当遍历到时,要记录下前面的最小和最大值,因为nums[i]可能为正也可能为负。
package likou;
/** 乘积最大子数组* 题干:* 给你一个整数数组 nums* 请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字)* 并返回该子数组所对应的乘积*/
public class Demo152 {/** 解题思路:* 采用动态规划算法,但这里需要注意的一点就是会存在负负得正得场景* 所以当遍历到i时,要想乘积最大,需要保证前面的积为最大或最小(nums[i]可能为正也可能为负)* */public int maxProduct(int[] nums) {int length = nums.length;if (length == 1) {return nums[0];}int maxValue = nums[0];// 前i个元素累积最大int minValue = nums[0];// 前i个元素累积最小int temp = nums[0];// 返回的最大乘积for (int i = 1; i < nums.length; i++) {//这里一定要定义一个局部变量int tempMax = maxValue;int tempMin = minValue;maxValue = Math.max(nums[i], Math.max(tempMax * nums[i], tempMin * nums[i]));minValue = Math.min(nums[i], Math.min(tempMax * nums[i], tempMin * nums[i]));if (temp < maxValue) {temp = Math.max(maxValue, minValue);}}return temp;}public static void main(String args[]) {Demo152 demo = new Demo152();int[] nums = {-4,-3,-2};System.out.println(demo.maxProduct(nums));}}
这篇关于力扣152-乘积最大子数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!