
两数之和思路灵神变形后num[j]target-num[i];//num[j]是要在哈希表中寻找的数变成了在一些数中找另一些数哈希表非常适合做这个数组的值作为key要找的就是数组的值map通过hash运算能直接判断key值是否存在O(1)。只用一次遍历一边查找num[i]一边将num[j],j //将num[i]看作算出来的数插入哈希表先从已经插入到map中的元素寻找key值再插入反过来会导致一个元素的二倍为target。classSolution{publicint[]twoSum(int[]nums,inttarget){MapInteger,IntegerhashmapnewHashMap();for(intj0;jnums.length;j){if(hashmap.containsKey(target-nums[j])){returnnewint[]{j,hashmap.get(target-nums[j])};}hashmap.put(nums[j],j);}returnnewint[]{};//返回空数组应对编译器报错问题}}Group Anagrams思路java灵神各元素字符排序后相同的在一组可以将排序后的值作为key原data作为value插入map集合中最后所有value就是结果。详细对于哈希表(hashmap),相同的key会将value覆盖所以结合题目value使用List接口类型。将String数组中的每个元素转换为char数组排序后再将其转换为String作为key首先判断map中是否含有key有-找到对应的value加到list数组中没有就将数据插入到map集合中。classSolution{publicListListStringgroupAnagrams(String[]strs){MapString,ListStringmapnewHashMap();for(inti0;istrs.length;i){char[]sstrs[i].toCharArray();Arrays.sort(s);StringsortedsnewString(s);if(!map.containsKey(sorteds)){map.put(sorteds,newArrayList());}map.get(sorteds).add(strs[i]);}returnnewArrayList(map.values());//map.values()返回一个集合包含所有的value}}使用default V computeIfAbsent(K key, Function? super K, ? extends V mappingFunction)入参key要查询或插入的键。mappingFunction当键不存在时执行的函数式接口接收key返回newValue。返回值返回最终与key关联的有效值不论是旧值还是刚刚计算生成的新值。如果指定的 key 不存在或者对应的值为null则通过计算函数生成一个新值并存入 Map最后返回当前有效的值classSolution{publicListListStringgroupAnagrams(String[]strs){MapString,ListStringmnewHashMap();for(Strings:strs){// 把 s 排序作为哈希表的 keychar[]sortedSs.toCharArray();Arrays.sort(sortedS);// 排序后相同的字符串保存到同一组中// computeIfAbsent如果 key 不在哈希表中则插入一个新的 ArrayListm.computeIfAbsent(newString(sortedS),_-newArrayList()).add(s);}// 哈希表的所有 value 就是分组结果returnnewArrayList(m.values());}}调用 map.computeIfAbsent(key, mappingFunction) │ key 存在且 value ! null ? / \ 是 / \ 否 / \ 直接返回已有 value 执行 mappingFunction 计算新 value │ 新 value null ? / \ 是 / \ 否 / \ 不修改 Map 将 (key, 新 value) 写入 Map 返回 null 返回新计算出来的 value