题目:两数之和
难度:简单
分类:数组,哈希表
解决方案:暴力求解、HashMap
力扣的第一道题也是很经典的题目据说大厂面试的时候问到过
暴力求解非常好想,一个双重循环即可
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res=new int[2];
for (int i = 0; i
但是这种方法并不好呀~
人家提供了一种更优解用HashMap (太久没写代码我已经手生的没办法了),学习一下
该题中需要返回的是数组下标,因此不能破坏数组中的位置关系,如果将数组进行排序则会破坏数组的位置关系,不能满足题目的要求。如何将数组的值与数组的位置关系进行绑定,是这个题目的关键。在java中可以通过HashMap来实现
具体思路如下:
1.遍历数组建立HashMap映射,其中HashMap的key为数组的值,value为数组的位置,即;
2.查找是否存在两个数之和等于target:
2.1遍历数组,得到第一个数字nums[i],记为num1,该数字在数组中的位置为i
2.2计算target-nums[i],计算结果为另一个需要的数字num2,若该数字存在,该数字在数组中的位置为hashMap.get(num2)
2.3在HashMap中判断num2是否存在:
若不存在,则跳转至2.1
若存在,则判断num1与num2对应的value是否相等:
若相等,则跳转至2.1
若不相等,则找到这两个数num1+num2=target ,返回对应的数组位置
实现代码如下
public static int[] tS(int[] nums,int target){
int[] res=new int[2];
Map map=new HashMap();
//1.建立HashMap映射
for (int i = 0; i
改进后执行的情况,(果然好很多哎)
整个算法流程是时间复杂度为O(n),由于使用了HashMap申请了内存空间,其空间复杂度为O(n)。
ok,第一道题结束!