/**
* 假设有一个数组arr,用户总是频繁的查询arr中某一段的累加和
* 你如何组织数据,能让这种查询变得便利和快捷?
*/
public class Code01_PreSum {
/**
* 获取startIndex~endIndex的和
* @param assistArr 辅助数组
* @param startIndex 开始位置
* @param endIndex 结束位置
* @return
*/
public static int rangeValue(int[] assistArr,int startIndex, int endIndex) throws Exception {
if(assistArr == null || assistArr.length == 0){
throw new Exception("数组为空");
}
if(startIndex < 0 || startIndex >= assistArr.length) {
throw new Exception("越界");
}
if(endIndex < 0 || endIndex >= assistArr.length) {
throw new Exception("越界");
}
if(startIndex == 0){
return assistArr[endIndex];
}
return assistArr[endIndex]-assistArr[startIndex-1];
}
/**
* 生成一个前缀和数组, 这是一个辅助数组,i位置的值等于前面0-i位置的和
* @param arr
* @return
*/
public static int[] assist(int[] arr){
if(arr == null || arr.length == 0){
return null;
}
if(arr.length < 2){
return arr;
}
int[] assistArr = new int[arr.length];
assistArr[0] = arr[0];
for (int i = 1; i < arr.length; i++) {
assistArr[i] = assistArr[i-1] + arr[i];
}
return assistArr;
}
public static void main(String[] args) throws Exception {
int[] arr = new int[]{2,5,4,7,8,9,2,3};
int[] assist = assist(arr);
System.out.println(rangeValue(assist, 2, 3));
}
算法基础之前缀和数组
最新推荐文章于 2025-12-31 21:25:26 发布
文章介绍了如何通过创建前缀和辅助数组,提高在给定数组中查询指定区间累加和的效率。作者给出了`rangeValue`方法和`assist`方法的实现,以处理数组的频繁查询需求。
748

被折叠的 条评论
为什么被折叠?



