题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
暴力解法
public static int [] twoSum(int [] nums, int target) {
for (int i = 0; i< nums.length; i++) {
for (int j = i+1; j < nums.length; j++) {
if(target - nums[j] == nums[i]) {
return new int[] {i, j};
}
}
}
return null;
}
双重循环,时间复杂度O(n^2)
优化解法
public static int [] twoSum(int [] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i< nums.length; i++) {
int tmp = target - nums[i];
if(map.containsKey(tmp)) {
return new int[] {map.get(tmp), i};
}
map.put(nums[i], i);
}
return null;
}
利用Hashmap解决,如果HashMap直接命中,时间复杂度最佳为O(n),如果HashMap命中链表或红黑树,最差为O(n^2)或O(n) + O(logn)