为什么我用二分法/暴力法在10000个int数里查三个和为0发生的次数不一样?

tbssl 2017-08-01 09:50:02
这个是《算法 第四版》里的一个题。
给出很大的一个int型数组,要求用暴力法和快速法查找 a[i]+a[j]+a[k] =0 这样的情况出现的次数,并比较用时

public class RandomInt {
public static void main(String[] args)
{
int[] a = new int[10000];
//这里是给数组a赋值的代码
Arrays.sort(a);

int cnt = 0;

for(int i = 0;i < a.length ;i++)
{
for(int j = i+1; j < a.length ;j++)
{
if(binarySearch(-a[i]-a[j],a,j) != -1 ) cnt++;
}
}
System.out.println(cnt);
}

public static int binarySearch(int key,int[] a,int j)
{
int hi = a.length-1;
int lo = j+1 ; //这里下界改为j
//int mid = (hi + lo) >>1;
while(lo <= hi)
{
int mid = (hi + lo) >> 1;
if(a[mid] > key) hi = mid - 1;
else if(a[mid] < key) lo = mid +1;
else return mid;
}
return -1;
}
}


如果将main函数里的循环代码换成暴力法
		for(int i = 0;i < a.length ;i++)
{
for(int j = i+1; j < a.length ;j++)
{
for(int k = j + 1;k < a.length ;k++)
{
if(a[i] + a[j] + a[k] == 0) cnt++;
}
}
}

结果是不一样的。

到底是哪里出了问题?
感觉这两个遍历都是对的。。。
...全文
275 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tbssl 2017-08-03
  • 打赏
  • 举报
回复
引用 4 楼 qq_26508409 的回复:
你的二分法找到一个就停了
原来如此!!太感谢了!!
Freefish1994 2017-08-02
  • 打赏
  • 举报
回复
这个应该是LeetCode中的3Sum问题,网上有很多代码的,楼主可以参考一下
nikyotensai 2017-08-02
  • 打赏
  • 举报
回复
你的二分法找到一个就停了
nikyotensai 2017-08-02
  • 打赏
  • 举报
回复
引用 2 楼 qq_26508409 的回复:
你二分法不先排序吗
不好意思,看漏了
nikyotensai 2017-08-02
  • 打赏
  • 举报
回复
你二分法不先排序吗

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧