1_1.两数之和
题目描述:

解题思路:
- 第一思路:
第一反应是将该数组排序,然后利用两个指针,左右进行查找。确实能查找到这两个值,但由于排序之后,索引值变了,导致不能返回正确结果。 - 暴力搜索法:
利用双重循环。外层循环用来遍历数组,内存循环用来查找哪一个满足target - nums[i] - 哈希表:
- 在查找
target - nums[i]的过程中,使用循环,使得查找的时间复杂度变成了O(n),而哈希表查找的效率是O(1);因此可以在遍历数组之前,先构建哈希表,在遍历数组的同时,查找当前索引位置对应的target - nums[i]的键值对。如果查找到,直接返回即可,反之,将当前键值对添加到哈希表中。 - 注意不要先将其加入哈希表,再查找。比如
[3,2,4] ,target = 6,如果先将3加入哈希表,然后查找6 - 3,仍然是他自己,不合题意。 - 最后的返回结果是
get(target - nums[i],i),而不是i在前面,这是因为,在查询的过程中,每次target - nums[i]都是在i之前的(哈希表从空开始一个个添加的),而不像暴力解法中,是查找他后面的。
- 在查找
代码:
暴力搜索法
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;
}
}
哈希表
class Solution {
public int[] twoSum(int[] nums, int target) {
//利用哈希表
//由于暴力解法中,在找寻nums[j],也就是target - nums[i]的时间复杂度是O(n),因此可以使用哈希表,来查找该值的位置
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);
}
return null;
}
}
滴水穿石、燕子衔泥,点点滴滴都是添补

浙公网安备 33010602011771号