hash在算法中的应用

题目一:第一个没有出现的正数

给定一个数组,从 1n,找出数组中第一个没出现的正数。

例如:

给定[1,2,0],则返回 3

给定[3,4,-1,1],则返回 2

注意:

算法需要 O(n)的时间复杂度以及线性的空间复杂度。

输入格式

第一行输入整数 n(n≤106),接下来一行输入数组A[n]

输出格式

输出第一个没出现的正数。

样例输入
5
4 2 0 1 4
样例输出
3

提示:hash

代码:

import java.util.HashSet;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in =new Scanner(System.in);
		int num=in.nextInt();
		int []a=new int[num];
		HashSet<Integer> set=new HashSet<Integer>();
		for(int i=0;i<num;i++) {
			a[i]=in.nextInt();
			set.add(a[i]);
		}
		for(int i=1;i<=num;i++) {
			if(set.add(i)) {
				System.out.println(i);
				break;
			}
			
		}
	}

}


题目二:两数之和

给定一个数组 numberi,找到两个数,使得他们的和为一个给定的数值target

其中:number[index1]+number[index2]==target

注意:index1 必须小于 index2 且不能为 0。假设每一组输入只有唯一的一组解。

例如,对于数组 [2,7,11,15]target=9index1 的值为 1index2的值为2

输入格式

第一行输入一个整数 n(1≤n≤500),接下来的两行分别输入nnn 个整数组成的数组 numberi(0≤numberi≤1000) 和一个整数target(0≤target≤1000)

输出格式

输出一行由空格分隔的两个整数 index1index2。注意,下标从1 开始

样例输入
3
5 75 25
100
样例输出
2 3

代码:

import java.util.HashMap;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in =new Scanner(System.in);
		int num=in.nextInt();
		int []a=new int[num];
		for(int i=0;i<num;i++) {
			a[i]=in.nextInt();
		}
		int target=in.nextInt();
		int []result=twoSum(a,target);
		System.out.print(result[0]+" "+result[1]);

	}
	// 使用HashMap(查找的时间复杂度为O(1))
		// 由题目假设知只有一对数满足该情况,故每个数都是唯一的,不存在重数的情况
		public static int[] twoSum(int[] numbers, int target) {
			if (numbers != null) {
				HashMap<Integer, Integer> num_map = new HashMap<>();
				for (int i = 0; i < numbers.length; i++) {
					if (num_map.containsKey(numbers[i])) {
						int index = num_map.get(numbers[i]);
						int[] result = { ++index, ++i };
						return result;
					} else {
						num_map.put(target - numbers[i], i);
					}
				}
			}
			return null;
		}


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值