【问题标题】:write an algorithm to find the maximum value写一个算法来找到最大值
【发布时间】:2015-10-13 02:02:23
【问题描述】:

示例:
数字是 [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, e 来修剪递归,因此我们最终不会多次递归同一事物。

想不出一种简单的动态编程方法。

有什么建议吗?

【问题讨论】:

  • 0 和 1 应始终相加,任何其他值应相乘。您想将可用的最小数字加 1。
  • 它可以很容易地使用链矩阵乘法的变体来完成,我想它已经在 SO 上回答过很多次了

标签: java algorithm recursion dynamic-programming backtracking


【解决方案1】:

这实际上可以通过一些简单的数学运算更容易解决。对于任意两个数字ab,以下适用:除非给出a = 1b = 1,否则给出a * b &gt;= a + b(假设a &gt;= 1b &gt;= 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;
}

如果这组数字是有序的。

【讨论】:

  • 他没有说清楚,但问题是数字是负数。
  • 是的,但这实在是太简单了,无法提及:if(n
  • @Paul 顺便说一句有一个小错误:if(n==1) 你应该加一个,而不是相乘...
  • @xXliolauXx 哎呀,小错字。谢谢,我更正了
  • 我认为这不是那么容易 Paul.. 使用您的解决方案,如果我给您 1、2、2,您将返回 4 或可能是 5,但正确答案将是 6(1+ 2)*2 顺便说一句,您认为我的解决方案有什么问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2013-12-03
  • 1970-01-01
  • 2013-01-16
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多