1.双指针的典型例题
**很容易想到使用两个指针确定每一层的起点和终点,确定之后进行一次遍历即可。
每一层的长度可以通过找规律发现,那么每一层的起点也是可以通过找规律发现的,其每一层的长度是等于每一层的起点的
此时双指针的算法就确定了,第一层循环指针i,在这一层循环进行指针j的循环,j从起点出发,循环长度d
同时需要注意j的长度不能超过n**,
2.最后需要输出的是层数,每次更新最大值的层数
3.数据的范围
完全二叉树的节点最多可以是N=1e5,最多可以有的层数数logN 下取整加1,也就是15-16层
倘若是满二叉树的话,16层节点数目是2^15,每一个节点数目的权值最大时1e5,超过int的范围
所以记录最大值的变量和每一层循环记录总和的变量都是需要采用long
package dbfs;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 完全二叉树的权值 {
/**
* @param args
* @throws IOException
* @throws NumberFormatException
*/
static long N=Long.MIN_VALUE;
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(bufferedReader.readLine());
int a[]=new int [n+1];
String p[]=bufferedReader.readLine().split(" ");
for(int i=1;i<=n;i++){
a[i]=Integer.parseInt(p[i-1]);
}
int d=1;
int depth=d;
int st=1;
long ma=N;
for(;st<=n;d++,st=st*2){
int s=0;
for(int j=st;j<st+(1 << (d-1)) && j<=n; j++){
s+=a[j];
}
if(s>ma){
ma=s;
depth=d;
}
}
System.out.println(depth);
}
}