从数组中找出其和为指定值得两个数:比如输入的数组为1、3、5、7、9、15,寻找的结果为10,那么输出下标0、4,或者1、3都可以。
(1)最直接的办法,遍历每一个元素,对于任意a[k],只需要遍历寻找是否存在值为sum-a[k]的数组元素。
(2)运用散列表,加快查找的时间
(3)运用排序两边查找。
实现代码如下:
package com.threeTop.www;
import java.util.Hashtable;
import com.threeTop.www2.QuickSort;
/**
* 从数组中找出其和为指定值得两个数
* @author wjgs
*
*/
public class Twosum {
/**
* 散列表实现
* @param array
* @param sum
*/
public static void find(int []array,int sum)
{
Hashtable<Integer, Integer> hashtable=new Hashtable<Integer, Integer>();
//首先填充散列表
for(int i=0;i<array.length;i++)
{
hashtable.put(array[i], i);
}
//依次判断对应值是否存在于散列表中
for(int i=0;i<array.length;i++)
{
int index=0;
if(hashtable.get(sum-array[i])==null)
{
return ;
}
else
{
index=hashtable.get(sum-array[i]);
}
if(index!=-1&&index!=i)
{
System.out.println(String.format("i:%d j:%d", i,index));
return ;
}
}
System.out.println("没有找到对应的两个数!");
}
/**
* 排序单数组法
* @param array
* @param sum
*/
public static void find2(int array[],int sum)
{
//此处浅拷贝
//int temp[]=array;
int []temp=new int[array.length];
for(int i=0;i<array.length;i++)
{
temp[i]=array[i];
}
//先快速排序
QuickSort quicksort=new QuickSort(array);
quicksort.sort();
int i=0;
int j=array.length-1;
while(i<j)
{
int sumtemp=array[i]+array[j];
if(sumtemp==sum)
{
//System.out.println(String.format("a[i]:%d a[j]:%d", array[i],array[j]));
for(int k=0;k<array.length;k++)
{
if(temp[k]==array[i])
{
System.out.print(temp[k]);
System.out.print("i:"+k+ " ");
}
if(temp[k]==array[j])
{
System.out.print("j:"+k);
}
}
return;
}else if(sumtemp>sum)
{
j--;
}
else
{
i++;
}
}
System.out.println("没有找到对应的两个数!");
}
public static void main(String[] args) {
//int []array=new int[]{1,3,5,7,9,15};
//int []array={1,3,5,7,9,15};
int []array={4,3,5,7,9,15};
Twosum.find(array, 8);
//System.out.println(" ");
Twosum.find2(array, 8);
}
}