我接下来要为大家分享一下我对于算法题目的理解,希望与大家交流,提升自己的算法能力,欢迎大家一起来交流。
题目链接在这里:1. 两数之和 - 力扣(LeetCode)
这个题暴力的解法是非常简单的,作为一道入门题目,我们只需要进行一次循环附加一次内循环,外层负责遍历,内层负责再次遍历寻找是否有值满足内外层指定的两个值之和是否等于target就好了。
但是这种解法过于简单,没法体现我们的code能力,所以我为大家介绍下面这种解法:
我们想一想我们的主要思想就是要查找两个值,和为target的两个值,对于查找而言,我们最常见的最好用的数据结构就是HashMap了,两次循环我们可以把它变成一次搭配HashMap进行配对查找,循环遍历外层的同时,同时向HashMap中添加元素和对应的下标,答案是两个值,在遍历到第一个值的时候我们直接将它放入map中,因为在每次遍历的时候我们都会检查之前进入到Map里的值有没有我们想要的,也就是和当前遍历到的值相加等于target的(map中存在target-当前的值的key),所以在第二个值的时候我们就可以直接返回结果了哈。
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);
}
return null;
}
}
这里要记住一些java中常见集合类的方法:
Set:加入元素add(),删除元素remove(),查看是否存在contains()
Map:加入元素put(),删除元素remove(),查看是否存在key:containsKey(),查看是否存在value:containsValue
List:加入元素add(),删除元素remove(),修改指定位置元素set(index,newVal),获取指定下标的值get(),获取指定值的下标indexOf();
Deque:入队offer(),出队poll(),模仿栈:入栈:push(),出栈:pop(),查看栈顶peek();