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加到可用的最小数上。使用链式矩阵乘法的变量可以很容易地完成,我想这已经被回答了很多次了