最清晰的解题思路(Java版)

数组求和统计

http://www.nowcoder.com/questionTerminal/efc16ce46397436a8d1a0008c52093c1

本篇题解使用java代码,但是思想不仅限于java,愿君有所得
特此感谢‘liuche’的思路!完整代码见尾部

1,结题思路

不使用暴力破解,因为会超时!如果想更快的解决这个问题,需要对于问题进行转换;主要是这个公式:
图片说明
这个公式比较难求解在具有两个变量:l与r,双份变量,双份难度!因此最好整成一个变量,那怎么办?举个例子

要求解 1+2+3+4+5+6  中第三个数字3到最后一个数字6之间的和可以怎么求?
(1+2+3+4+5+6) - (1+2+3) + 3
有人说,那这样不是很繁琐???对的,但是这样我们发现公式中的变量只剩下一个,即r或者l,怎么说
我们令S(i)表示数组A从0->i位置上的所有数据的和,则:
s(6) = (1+2+3+4+5+6)
S(3) = (1+2+3)
原来的式子就可以表示为:
S(6) - S(3) + A[3]
因此,我们只需要考虑如何求解S中的每个值即可

返回到原式中,可以根据上述描述将式子转换为:
图片说明
进一步调整两边的变量,得到最终的结果
图片说明
sumArray[i]为数组a中从位置0到位置i上的所有元素之和,则上述式子可以表述为

图片说明

求解数组sumArray则相对来说比较简单了,具体的代码如下:

2,完整代码

import java.util.*;


public class Solution {
    /**
     * 计算有多少对符合条件的数对
     * @param a int整型一维数组 数组a
     * @param b int整型一维数组 数组b
     * @return int整型
     */
    public int countLR (int[] a, int[] b) {
        // write code here
        int result = 0;
        int sumArray[] = new int[a.length];
        sumArray[0] = a[0];

        for(int i = 1; i <a.length; i++)
            sumArray[i] = sumArray[i-1] + a[i];


        for(int l = 0; l < a.length; l++)
            for(int r = l; r <b.length; r++)
                if(sumArray[r] - b[r] == sumArray[l] - a[l] + b[l])
                    result++;

        return result;
    }
}
全部评论

相关推荐

jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务