两数之和
思路:(灵神)变形后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){Map<Integer,Integer>hashmap=newHashMap<>();for(intj=0;j<nums.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{publicList<List<String>>groupAnagrams(String[]strs){Map<String,List<String>>map=newHashMap<>();for(inti=0;i<strs.length;i++){char[]s=strs[i].toCharArray();Arrays.sort(s);Stringsorteds=newString(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{publicList<List<String>>groupAnagrams(String[]strs){Map<String,List<String>>m=newHashMap<>();for(Strings:strs){// 把 s 排序,作为哈希表的 keychar[]sortedS=s.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