-
首先要有一个思路。
定义一个数组: int[] array = {6,4,3,2,-4,5}; 如果要求下标2到5之间的数据之和(但是每个下标对应的数据是从下标零到下标的),怎么样写才是最快的呢?
如果是循环去找指定下标并且去做判断是否到了开始下标,和结束下标。然后把这些之间的数据加起来求和也是可以点,但是它不是最快的。 -
最佳的解决思路。
借助一个其他数组help[],用于存储array的下标数据之和,放到一个新数组中,然后用于求取数据之和。怎么放呢?下面这样放。
-
有了这个求和后的help数组之后的思路。
因为是求两个下标之间的数据之和,就是会有两个下标的L,R。
所以我们以后每次求取的时候就去到help数组中拿下标为R的数据之和这个其实是0到R的数据之和,在去Help去拿L-1的数据之和 这个其实是0到L-1的下标之和。 这样用R的数据减去L-1的数据就是 L到R下标数据之和。
看不懂没关系,都是代码人,看代码吧。
//算法求取数据 ,2022.3.17 看算法课第一题,根据思路编写的代码
@Test
public void sumIndexNum(){
/**
* 解决问题: 定义一个数组,写一个方法 用于求取指定下标到指定下标 的数据,怎么做才能最快
* 思路:1、借用另一个数组存储 0-指定下标数据之和。
*/
long start = System.currentTimeMillis();
int[] array = {6,4,3,2,-4,5};
int[] help = new int[6];
for (int i=0; i<array.length ;i++){
if(i==0){
help[i] = array[i];
}else{
help[i] = help[i-1]+array[i];
}
}
/**
* 这样以后如果需要哪个下标到那个下标之和 【L,R】,就可以先拿help的第R个数据之和 减去 help数组的L-1的数据就可以了。
* L=2,R=5 这两个分别是下标
*/
System.out.println("得到执行下标与下标之和是:"+ this.sum(help,2,5));
long end = System.currentTimeMillis();
System.out.println("用时:"+( end - start));
}
public int sum(int[] help,int L,int R){
if(help.length-1 < R || R < 0 || (L-1) < 0 || L > help.length-1 ){
return 0;
}
return help[R] - help[L-1];
}
You can nearly always enjoy something if you make up your mind firmly that you will.
只要你下定决心做某件事,总能从中找到乐趣。
版权声明:本文为weixin_45213302原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。