题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
你可以按任意顺序返回答案。
我的解法
思路
作为题库中的第一题,最直接的方法就是两层循环遍历,寻找符合的坐标
思考下这题虽然也是两个整数,但快慢指针并不合适,因为需求上就要求能遍历到所有两个元素的和
对应Java代码
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] indexArr = new int[2];
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] == (target - nums[j])) {
indexArr[0] = i;
indexArr[1] = j;
return indexArr;
}
}
}
return null;
}
}
复杂度分析
时间复杂度:O(n²)
空间复杂度:O(1)
更优解法
思路
本题使用哈希法最为合适
对应Java代码
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i< nums.length; i++) {
if(map.containsKey(target - nums[i])) {
return new int[] {map.get(target-nums[i]),i};
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
}
复杂度分析
时间复杂度:O(n) 无序的HashMa查询效率为O(1)
空间复杂度:O(1)
收获总结
什么时候使用Hash结构呢?
- 当题目中需要反复使用查询操作,或者使用时查询操作可以降低复杂度时,可以考试使用Hash结构
- Hash结构也只是存储数据的一种结构,只不过针对查询等操作做了优化