题目地址:https://leetcode.cn/problems/two-sum/
思路1:双重循环遍历
最直接的思路,从第一个数组元素开始,逐个对比与其它元素的和,如果满足和为目标值,直接输出对应的数组下标。代码如下:
class Solution {
public int[] twoSum(int[] nums, int target) {
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};
}
}
}
return null;
}
}
该算法的时间复杂度为O(n2),属于暴力解法,是基础中的基础。
思路二:巧用Hash表
暴力解法中的第二次循环其实有一部分是第一次循环已经扫描过的数据,可以从这个地方入手,构造一个Hash表,在一次循环中记录下已经扫描的元素,避免二次扫描。由于输出的结果是数组的下标,因此Hash表的key是数组元素本身,value则是对应的下标。代码如下:
class Solution {
HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
int[] result = new int[2];
public int[] twoSum(int[] nums, int target) {
for(int i=0;i<nums.length;i++) {
if(hashMap.get(target-nums[i]) == null) {
hashMap.put(nums[i], i);
}else{
result[0] = hashMap.get(target-nums[i]);
result[1] = i;
}
}
return result;
}
}
该算法只有一层循环,时间复杂度为O(n),引入了一个HashMap,空间复杂度为O(n)。