力扣100题-哈希:两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
题解1:暴力求解,时间复杂度 O(n2)
public static int[] sum(int[] nums , int target) {
// 暴力循环求解,一个从头开始循环,循环到尾-1,一个从头+1开始循环,循环到尾
for (int i = 0; i < nums.length-1; i++) {
for (int j = i+1; j<nums.length ; j++) {
if(nums[i]+nums[j]==target) {
// 满足题目需求
return new int[]{i,j};
}
}
}
throw new IllegalArgumentException("没有满足条件的数值!");
}
题解2:使用hash求解 ,时间复杂夫 O(n)
理解:
hash求解,参考了力扣大佬的题解,思路:创建一个空的hashmap集合,
循环 数组,每次循环都让containskey,进行判断hashmap集合中是否有(target - nums[i])该key值,
如果没有,就将(target - nums[i])做为key进行存储,value为i,知道找出该值,
如果不存在可以抛出异常进行提示
因为题目要求只有一个满足条件,所有直接return一个数组即可
public static int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
// 判断是否有满足(target - nums[i])的key值
if(map.containsKey(target-nums[i])) {
// 满足条件,返回数组下表
return new int[] {map.get((target-nums[i])),i};
}
// 如果没有该key值,就将num[i]的值作为key,i作为value存入map集合中
map.put(nums[i],i);
}
// 如果都不满足条件,可以抛出异常给予提示
throw new IllegalArgumentException("没有满足条件的数值!");
}