例:
数字是[1,2,3],你有+,*
最大值为1 + 2 * 3
示例[1,1,1],ans是1 + 1 + 1
我可以想到一个简单的递归算法:
private static double helper(double[] arr, int s, int e) {
System.out.println("s= " + s + " e= " + e);
//base case: if single elem, return that eleme
if (e==s) {
return arr[s];
} if (s+1==e) {
return Math.max(arr[s]+arr[e], arr[s]*arr[e]);
} else if (s>e) {
//this should never happen
throw new UnsupportedOperationException("invalid operation");
}
//int mid = s+ ((e-s)/2);
int mid=s;
double fMax = Double.MIN_VALUE;
for (mid=s;mid<e;mid++) {
//divide and conqr route
double lres = helperDQ(arr,s, mid);
double rres = helperDQ(arr,mid+1, e );
System.out.println("s= " + s + " e = " + e + " m = " + mid + " lres= " + lres + " rres= " + rres);
fMax = Math.max(fMax, Math.max(lres*rres, lres+rres));
}
return fMax;
}
private static double findMax(double[] arr) {
return helper(arr, 0, arr.length-1);
}
有没有更好的方法来代替这种递归方式?我们可以通过检查s来修剪递归,因此我们不会多次递归相同的事情。
无法想到一种简单的动态编程方法。
有什么建议吗?
答案 0 :(得分:2)
使用一些简单的数学,这实际上可以更轻松地解决。对于任意两个数字a
和b
,以下情况适用:除非给出a = 1
或b = 1
,否则会给出a * b >= a + b
(假设a >= 1
和b >= 1
)。这适用于任何数字集。因此,最大值将始终通过
int maxNum(int[] nums){
int x = 0;
for(int n : nums)
if(n == 1)
x += n;
else
if(x == 0)
x = n;
else
x *= n;
return x;
}
如果这组数字是订单。