(题目来源:力扣LeetCode)
题目:
给定一个整数数组 nums 和一个目标值 target,在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
方法一:
枚举法:
遍历所有数字,找出两数之和与目标值相等的数的组合
两个变量for循环:i,j且都与n相关,所以时间复杂度为O(n*2)
只用到常数个临时变量,所以空间复杂度为O(1)
方法二:查找表法
(使用一个表,先抓取一个元素,如果没有与之配对的另一个元素,则将该元素放在表中,然后继续向下寻找,直到找出配对的两数)
比如:
第一个数6,8-6=2。2不在表中,所以将数字6放入表中,并向后抓取第二个数进行测试。第二个数3,8-3=5。5不在表中,所以将数字3放入表中,继续向后抓取......
class Solution {
public int[] twoSum(int[] nums, int target) {
//定义一个hashmap
Map<Integer, Integer> map = new HashMap<>();
//遍历数组
for(int i =0; i<nums.length ; i++){
//如果存在一个key值,使target-num[i]=key,返回key的下标和i对应值的下标
if(map.containsKey(target-nums[i])){
return new int[]{map.get(target-nums[i]),i};
}
//如果不存在key值,使target-num[i]=key,将键值对存入表中;
map.put(nums[i],i);
}
//当遍历完数组也没有找到两数之和为目标值,抛出异常
throw new IllegalArgumentException("No two sum soltion");
}
}