java
1,0<=l<=r<=n-1面试
2,sum_{i= l}^{r}{a_i} = b_l + b_r∑i=lra**i=b**l+b**r数组
示例1架构
[1,2,3,4],[2,1,4,5]
4
知足条件的数对有(0, 1), (0, 2), (1, 1), (1, 2)(0,1),(0,2),(1,1),(1,2)
示例2学习
[0,0,1,1,1],[2,0,4,3,3]
2
不使用暴力破解,由于会超时!若是想更快的解决这个问题,须要对于问题进行转换;主要是这个公式: 这个公式比较难求解在具备两个变量:l与r,双份变量,双份难度!所以最好整成一个变量,那怎么办?举个例子spa
要求解 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上的全部元素之和,则上述式子能够表述为code
视频
blog
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; } }
最后的最后,上点干货。(但凡是有个这样的女友,我会熬夜么?)教程
最后我把我收集的各大厂经典高频面试题和Java高级进阶、架构师视频教程送予你们。部分资料以下图所示:
获取地址: