【发布时间】:2020-07-17 22:32:25
【问题描述】:
我看到了一个问题,我想知道是否可以使用递归来解决它。如下:
编写一个算法,当给定一个输入数组时,从这些输入中找到最大乘积。例如:
Input: [1, 2, 3]
Output: 6 (1*2*3)
Input: [-1, 1, 2, 3]
Output: 6 (1*2*3)
Input: [-2, -1, 1, 2, 3]
Output: 12 (-2*-1*1*2*3)
我正在尝试找到一种使用递归来解决它的方法,但是我尝试的算法不起作用。我用Java编写的算法如下
Integer[] array;
public int maximumProduct(int[] nums) {
array=new Integer[nums.length];
return multiply(nums, 0);
}
public int multiply(int[] nums, int i){
if (array[i]!=null){
return array[i];
}
if (i==(nums.length-1)){
return nums[i];
}
int returnval=Math.max(nums[i]*multiply(nums, i+1), multiply(nums, i+1));
array[i]=returnval;
return returnval;
}
这个算法的问题是,如果有偶数个负数,它就不能很好地工作。例如,如果 nums[0]=-2、nums[1]=-1 和 nums[2]=1,则 multiply(nums, 1) 将始终返回 1 而不是 -1,因此它始终会看到 1在 multiply(nums, 0) 处大于 1*-2。但是,我不确定如何解决这个问题。有没有办法使用递归或动态编程来解决这个问题?
【问题讨论】:
-
如果你被限制为 int,计算负整数的个数。如果为奇数,则丢弃最小的负整数,否则将所有其他整数相乘以获得最大的乘积。首先删除所有零。不需要递归。
-
是递归还是双for循环也可以?
-
我希望使用递归,只是因为我想通过递归来提高我的技能,这一直是我的弱点。
标签: java algorithm recursion dynamic-programming divide-and-conquer