Java 在寻找子阵的最大和时需要时间限制
这是我使用段树()查找给定数组的子数组的最大和的解决方案,但是我得到了TLE(超过时间限制的错误)。有人能建议对这段代码进行更多的优化吗Java 在寻找子阵的最大和时需要时间限制,java,arrays,segment-tree,Java,Arrays,Segment Tree,这是我使用段树()查找给定数组的子数组的最大和的解决方案,但是我得到了TLE(超过时间限制的错误)。有人能建议对这段代码进行更多的优化吗 public class segmentTree { int st[]; segmentTree(int arr[], int n){ int x = (int)Math.ceil(Math.log(n)/Math.log(2)); int maxSize = (int)Math.pow(2, x)<&l
public class segmentTree {
int st[];
segmentTree(int arr[], int n){
int x = (int)Math.ceil(Math.log(n)/Math.log(2));
int maxSize = (int)Math.pow(2, x)<<1 - 1;
st = new int[maxSize];
constructSTUtil(arr, 0, n-1, 0);
}
int getMid(int s, int e) {
return s + (e - s)>>1;
}
int getSumUtil(int ss, int se, int qs, int qe, int si)
{
if (qs <= ss && qe >= se)
return st[si];
if (se < qs || ss > qe)
return 0;
int mid = getMid(ss, se);
return getSumUtil(ss, mid, qs, qe, si<<1 + 1) +
getSumUtil(mid + 1, se, qs, qe, si<<1 + 2);
}
int getSum(int n, int qs, int qe)
{
if (qs < 0 || qe > n - 1 || qs > qe) {
return -1;
}
return getSumUtil(0, n - 1, qs, qe, 0);
}
int constructSTUtil(int arr[], int ss, int se, int si)
{
if (ss == se) {
st[si] = arr[ss];
return arr[ss];
}
int mid = getMid(ss, se);
st[si] = constructSTUtil(arr, ss, mid, si<<1 + 1) +
constructSTUtil(arr, mid + 1, se, si<<1 + 2);
return st[si];
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(in.readLine().trim());
int array[] = new int[n];
String arr[] = new String[n];
arr = in.readLine().split(" ");
for(int i=0; i<n; i++){
array[i] = Integer.parseInt(arr[i].trim());
}
segmentTree tree = new segmentTree(array, n);
int m = Integer.parseInt(in.readLine());
while(m-- > 0){
String ind[] = new String[2];
ind = in.readLine().split(" ");
int x = Integer.parseInt(ind[0].trim());
int y =Integer.parseInt(ind[1].trim());
int maxSum = -999999999;
for(int i=x-1; i<=y-1; i++){
for(int j=x-1; j<=y-1; j++){
if(tree.getSum(n, i, j) > maxSum)
maxSum = tree.getSum(n, i, j);
}
}
System.out.println(maxSum);
}
}
}
公共类分段树{
int st[];
分段树(int arr[],int n){
intx=(int)Math.ceil(Math.log(n)/Math.log(2));
intmaxsize=(int)Math.pow(2,x)1;
}
int getSumUtil(int-ss、int-se、int-qs、int-qe、int-si)
{
如果(qs=se)
返回st[si];
如果(seqe)
返回0;
int mid=getMid(ss,se);
return getSumUtil(ss、mid、qs、qe、siOn)您执行测试的数据量是多少?您使用什么C#编译器实现?元素数小于50000,而元素值介于-15007和15007之间,