我正在练习关于hackerearth的问题:
在这个问题中,我编写了一个二进制搜索代码,我曾用过:
int mid =(低+高)/ 2
我的循环卡在这里,所以我在某些情况下得到了TLE。 意识到这个问题(选择了反复低的问题) 我改变了mid到low +(high-low + 1)/ 2并改变了整个测试用例 通过。 (代码1)
我在使用(低+高)/ 2时也遇到了类似的问题,并且还通过了所有测试用例。
我的问题是我们如何决定如何选择中期?
PS:这些是练习题,现在(我)解决了
public static boolean subarray(int mid,long x,long[] sum,int[] a){
int n=a.length;
for(int i=0;i<n-mid+1;i++){
if(sum[mid+i-1]-sum[i]+a[i]>x){
return false;
}
}
return true;
}
public static void binarysearch(long[] sum,int [] a,long x){
int low=1;
int high=a.length;
while(low!=high){
int mid=low+ (high-low+1)/2; //passed
//int mid=(low+high)/2; did n't PASS
if(!subarray(mid,x,sum,a)){//if some greater then x
high=mid-1;
}
else{
//if some less then x okay but can go for more
low=mid;
}
}
System.out.println(low);
}
public static long binarysearch(long[] a,long x,long[] L,long[] R){
//find first index >= x
BufferedOutputStream out=new BufferedOutputStream(System.out);
int low=0;
int high=a.length;
while(low!=high){
int mid=(low+high)/2;
if(a[mid]<x){
low=mid+1;
}
else{
high=mid;
}
}
long ans=L[low]+x-1;
if(low!=0){
ans=L[low]+x-a[low-1]-1;
}
return ans;
}
答案 0 :(得分:2)
这项技术:
low + (high - low) /2
主要用于避免整数溢出。
由于mid是数字类型的实例,因此它具有可容纳的值的上限。低值和高值之和可能超过此最大值,从而导致溢出和不可预测的结果。即使低和高都是合法值(即正和高&gt; =低),也会发生这种情况。
表达式mid = low +(high - low)/ 2对于高和低的合法值永远不会溢出,并且总是会给出所需的结果。
示例:
int low = 1170105034
int high = 1347855270
(low + high) / 2 //outputs -888503496
low + (high - low) / 2 //outputs 1258980152