写一个算法来找到最大值

时间:2015-07-22 23:53:56

标签: java algorithm recursion dynamic-programming backtracking

例:
数字是[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来修剪递归,因此我们不会多次递归相同的事情。

无法想到一种简单的动态编程方法。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

使用一些简单的数学,这实际上可以更轻松地解决。对于任意两个数字ab,以下情况适用:除非给出a = 1b = 1,否则会给出a * b >= a + b(假设a >= 1b >= 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;
}

如果这组数字是订单。