本章是哈希相关的知识,题目用哈希相关知识来解 ,相关知识:java集合通用方法-优快云博客
高效学习HashMap:
Map<Integer,Integer>setMap=new HashMap<>();
<_1_,_2_>,1的位置是键,2的位置是值,键不可重复,值可重复(就是说键不可以相同,而值可以相同),1,2位置可填写不同类型,常用的有String,Integer,Character,Double,Float,Long,Short,Byte等,注意开头都是大写,根据要储存的值来决定添什么类型。
hashmap就像一个高效的搜索引擎,将数据存放在里面后,通过“键”就能快速的找到,不用在一个一个式的遍历查找需要的元素。
HashMap 是一种基于哈希表的数据结构,它通过“键”来高效地存储和检索对应的“值”。其核心思想是使用哈希函数将“键”映射到一个特定的索引位置,从而将数据存储在哈希表的相应位置中。当需要查找某个“值”时,HashMap 会再次通过哈希函数快速定位到该“键”对应的索引位置,直接访问存储的“值”,而不需要像数组或列表那样逐个遍历查找。这种机制使得 HashMap 的查找、插入和删除操作在平均情况下具有 O(1) 的时间复杂度,非常高效。
hashmap常用方法
put(K key, V value):将指定的键值对插入到HashMap中。如果键已经存在,则更新对应的值。(键是不可重复的)get(Object key):根据键获取对应的值。如果键不存在,则返回null。remove(Object key):根据键删除对应的键值对。containsKey(Object key):检查HashMap中是否包含指定的键。containsValue(Object value):检查HashMap中是否包含指定的值。keySet():返回HashMap中所有键的集合。values():返回HashMap中所有值的集合。entrySet():返回HashMap中所有键值对的集合。
通过这一题,让我们知道HashMap的好处,为什么用HashMap,以及以后什么时候还用HashMap

思路一:
暴力遍历所有结果,将各个元素进行相加,找到可以成功的值,返回其索引;
class Solution {
public int[] twoSum(int[] nums, int target) {
int[]arr=new int[2];
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
arr[0]=i;
arr[1]=j;
break;
}
}
}
return arr;
}
}
思路二:
法一:
用HashMap进行优化,
为了便于理解HashMap的作用
我们可以将所用的元素一次性的全部添加到HashMap中,for循环+hash.put(nums[i],i);进行数据存放
再依次判断是否存在,(高效的引擎快速能快速查找到)hash.containsKey(target-nums[i])
同时要注意不能使用两次相同的元素这一条件,hash.get(target-nums[i])!=i,这样找到的元素索引就不会一样,不会两次使用相同的元素;
与思路一中的暴力双循环相比较,HashMap的好处是进行存储要查询的元素,以便快速找到,达到避免再加一层for循环再次进行查找的作用。
这种写法有弊端------如果数组中有多个相同的元素,HashMap 只会存储最后一个元素的索引。
这题的解法巧妙解决了这个问题,当有重复的元素时,不会查找i==hash.get(target-nums[i])时的元素(已被覆盖掉了),而是可以查找i!=hash.get(target-nums[i])即重复元素最后的出现(重复元素最后保留下来的)。但是普适性还是法二更好
class Solution {
public int[] twoSum(int[] nums, int target) {
int[]arr=new int[2];
HashMap<Integer,Integer> hash=new HashMap<>();
for(int i=0;i<nums.length;i++){
hash.put(nums[i],i);
}
for(int i=0;i<nums.length;i++){
if(hash.containsKey(target-nums[i])&&hash.get(target-nums[i])!=i){
arr[0]=i;
arr[1]=hash.get(target-nums[i]);
break;
}
}return arr;
}
}
法二:
将元素用hashmap依次进行存储,
class Solution {
public int[] twoSum(int[] nums, int target) {
int[]arr=new int[2];
int n=nums.length;
Map<Integer,Integer>setMap=new HashMap<>();
for(int i=0;i<n;i++){
if(setMap.containsKey(target-nums[i])){
arr[1]=i;
arr[0]=setMap.get(target-nums[i]);
break;
}else{
setMap.put(nums[i],i);
}
}return arr;
}
}
遍历原数组,每一次都进行查找是否存在合适的键的元素,如果没有就进行添加循环到索引i的nums[i]元素为“键”,并将i作为“值”进行存储,这样既可以快速找到合适的元素,并且也可以通过键返回的值作为原数组的索引。
通俗一点,就是说,每一次查询元素index索引比哈希表map中的总长度length还要大一, (target-nums[1];hashMap中没有存如一个键值对,target-nums[2];hashMap中有一个键值对......)因此,索引i和setMap.get(target-nums[i])不会一样。
记忆哈希用法窍门:
想要在hashmap中快速查找一个元素(A,索引n),哈希表中保存的是这个元素之前的所有元素(0,1,2,3,...,n-1),在0--n-1中查找,如果没有,才将这个当前索引n的元素存放在hashmap中。
“值”是要查询的结果,“值”是目标!!!


被折叠的 条评论
为什么被折叠?



