1. 问题描述
给定一个数组nums和目标数target,要求从nums中找到两个数,使其和等于target,返回其index;
public int[] twoSum(int[] nums, int target){
}
2. 问题解决
1)沙比方法:暴力法,时间复杂度O(n^2);
2)两遍哈希表
思路:暴力法之所以沙比,因为用了两重循环,时间复杂度为O(n^2);其中,第一重循环是对数组元素循环,数组nums有n个元素,需要循环n遍;在每一层循环内部,针对当前元素,查找对应元素;总的循环次数为:(n-1)+(n-2)+...+1,时间复杂度为O(n^2)。
其中,查找这步,可进一步简化。
哈希表,实现数据的键值对的存储,可将查找的时间复杂度降为O(1)。
3. Java实现
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}
3. 补充知识
关于哈希表的使用,可参考:https://www.cnblogs.com/skywang12345/p/3310835.html