package Chapter2;
/*
* 题目:算法导论2.3.7
* 请给出一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,
* 判断出S中是否存在有两个其和等于S的数
*
*算法思想:
*1、默认集合S是排序过的,若果没有排序,先排序。。。各种排序方法。
*2、本问题是二分查找的变形。。
* for i ←1to n
* temp=x-array[i]
* 二分查找temp
*
*/
public class SearchSum {
public static void main(String args[])
{
int[]s={1,3,6,9,45,68,106};
int x=9;
Index index = new SearchSum().getFittedIndex(s, x);
if(null==index)
System.out.println("can't find");
else
{
System.out.println("index_1: "+index.getIndex_1());
System.out.println("index_2: "+index.getIndex_2());
}
}
public Index getFittedIndex(int []s,int x)
{
int result=-1;
int i;
for( i=0;i<s.length-1;i++)
{
int temp=x-s[i];
//二分查找temp
result = search(s,1,s.length-1,temp);
if(result>=0)
break;
}
if(result<0)
return null;
else
return new Index(i,result);
}
public static int search(int[] array,int start,int end,int target)
{
int middle = (start+end)/2;
if(target==array[middle])
return middle;
/*
* 当数列只剩两个元素时{start,end}
* 由于middle每次都等于start,故做特殊判断
*
*/
if(end==start+1)
if(target==array[end])
return end;
else
return -1;
if(target<array[middle])
return search(array,start,middle,target);
if(target>array[middle])
return search(array,middle,end,target);
return -1;
}
}
class Index {
private int index_1;
private int index_2;
public int getIndex_2() {
return index_2;
}
public void setIndex_2(int index_2) {
this.index_2 = index_2;
}
public int getIndex_1() {
return index_1;
}
public void setIndex_1(int index_1) {
this.index_1 = index_1;
}
public Index(int index_1, int index_2) {
super();
this.index_1 = index_1;
this.index_2 = index_2;
}
}