一个数组,大小和每个元素的值在编译时已知。设计一个算法用最快速的方式计算两个下标间所有数组元素的和
小弟想了下int beginIndex;
int endIndex;
for(int i=beginIndex;i<=endIndex;i++){
  sum+=a[i];
}时间复杂度是O(length)最坏的情况是0 - array.length
不会就这么简单吧?求各位给看看,小弟感激不敬 

解决方案 »

  1.   

    //初始化代码
    int [] b = new int[a.length];
    for (int i=0; i<a.length; i++)
      b[i] = i == 0 ? 0 : b[i-1] + a[i];public int getSum(beginIndex, endIndex) {
      return b[endIndex] - beginIndex == 0 ? 0 : b[beginIndex - 1];
    }
      

  2.   


    我把你的代码改了下作了下调试你看是这样的不?
    /* 程序初始化时,重新定义一个数组,数组的元素是目标数组中每个元素到目标数组开始位置的所有元素的和
         例如b[2]=a[0]+a[1]+a[2]
       */
    int[] b = new int[a.length];
    for (int i = 0; i < a.length; i++)
    b[i] = i == 0 ? a[0] : b[i - 1] + a[i];


    /**
     * 题目二:一个数组,大小和每个元素的值在编译时已知
     * 设计一个算法用最快速的方式计算两个下标间所有数组元素的和。
     * @param a 被计算的数组
     * @param beginIndex 数组被计算和的开始位置下标
     * @param endIndex 数组被计算和的结束位置下标
     * @return 下标间所有数组元素的和
     * @throws Exception  下标值不满足要求时抛出异常
     */
    public  int getSum(int beginIndex, int endIndex) throws Exception {
    if (endIndex > a.length -1) {
    throw new IndexOutOfBoundsException("结束下标超过数组长度");
    }
    if (beginIndex < 0) {
    throw new IndexOutOfBoundsException("开始下标小于0");
    }
    if ((endIndex - beginIndex < 0)) {
    throw new Exception("被计算的结束下标需要比开始下标大");
    }
    return endIndex - beginIndex == 0 ? 0 : b[endIndex]- b[beginIndex]+ a[beginIndex];
    }
      

  3.   

    你确定这里是   b[i] = i == 0 ? 0 : b[i-1] + a[i];  而不是  b[i] = i == 0 ? a[0] : b[i-1] + a[i];
      

  4.   

    好像不对。endIndex - beginIndex == 0,就是说endIndex 和 beginIndex都是3的时候,你返回的是a[0] + a[1] + a[2] + a[3],还是返回0?
      

  5.   

    还有,您的代码在初始化的时候就使用了for进行累加,而且好像还做了些无用的操作,执行效率也不一定高哟。我觉得楼主的代码的效率已经算很高了。