数组的更多应用

    从数组中找出其和为指定值得两个数:比如输入的数组为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);
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值