3. 两数之和

1.题目:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

2.方法一:暴力求解。复杂度O(n^2)

3.方法二:哈希映射。复杂度O(n)

由于哈希查找的时间复杂度为 O(1),所以可以利用哈希容器 map 降低时间复杂度。
遍历nums数组,i 为当前下标,判断map中是否存在 target-nums[i] 的 key 值
如果存在则找到了两个值;如果不存在则将当前的 (nums[i],i) 存入 map 中,继续遍历直到找到为止
如果最终都没有结果则抛出异常。

补充:对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。

map的用法:

1)map(键,值)  。数组值作为键,该值所对应的数组下标作为值

2)值 = map.get(键)

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

public class Main {
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		//1. 输入相关数据
		int n = sc.nextInt();
		int nums[] = new int[n];
		for(int i=0;i<n;i++) {
			nums[i] = sc.nextInt();
		}
		int target = sc.nextInt();
		int index1=0,index2=0;
		//2.使用map查找(数组值,该值所对应的数组下标)
		Map<Integer, Integer> map  = new HashMap<Integer, Integer>();
		for(int i=0;i<n;i++) {
            // 先查找,再存储num[i],避免查找num[i]本身
			if(map.containsKey(target-nums[i])) {//有该值,则查找成功
				index1 = i;
				index2 = map.get(target-nums[i]);
				break;
			}
			map.put(nums[i],i); //将当前遍历的元素存入map
		}
		//3.输出结果
		System.out.println(index1+"  "+index2);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值