Java 写一个算法来找到最大值
示例:Java 写一个算法来找到最大值,java,algorithm,recursion,dynamic-programming,backtracking,Java,Algorithm,Recursion,Dynamic Programming,Backtracking,示例: 数字是[1,2,3],u有+* 最大值为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
数字是[1,2,3],u有+* 最大值为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);
}
private静态双助手(double[]arr,int s,int e){
System.out.println(“s=“+s+”e=“+e”);
//基本情况:如果是单个元素,则返回该元素
如果(e==s){
返回arr[s];
}如果(s+1==e){
返回数学最大值(arr[s]+arr[e],arr[s]*arr[e]);
}否则,如果(s>e){
//这永远不应该发生
抛出新的UnsupportedOperationException(“无效操作”);
}
//int mid=s+((e-s)/2);
int mid=s;
double fMax=double.MIN_值;
对于(mid=s;mid这实际上可以通过一些简单的数学来解决。对于任何两个数字a
和b
,以下情况适用:除非给出a=1
或b=1
,否则,a*b>=a+b
(假设a>=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;
}
如果一组数字是有序的。他没有明确说明,但问题允许数字为负数。是的,但这实在太简单了,不值得一提:如果(n@Paul顺便说一句,这里有一个小错误:if(n==1)你应该加一,而不是乘…@xXliolauXx哦,有点错。谢谢,我会更正它。我认为这不会那么容易。保罗。根据你的解决方案,如果我给你1,2,2,你会返回4或者可能是5,但正确的答案是6(1+2)*2顺便说一句,你看到我的解决方案有什么问题吗?0和1应该总是相加,任何其他值都应该相乘。你想把1加到可用的最小数上。使用链式矩阵乘法的变量可以很容易地完成,我想这已经被回答了很多次了