LeetCodeHot100 哈希 1.两数之和 46.字母异位词分组 128.最长连续序列

1.两数之和
https://leetcode.cn/problems/two-sum/description/?envType=study-plan-v2&envId=top-100-liked

public int[] twoSum(int[] nums, int target) {
        HashMap<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if(map.containsKey(target - nums[i]) && map.get(target - nums[i]) != i){
                return new int[]{i,map.get(target - nums[i])};
            }else{
                map.put(nums[i],i);
            }
        }
        return new int[2];
    }

总结:hashmap的一大优势就是存取数据时间O(1),所以使用了hashmap,使用hashmap要注意的就是key和value的选取,具体问题具体分析。这道题能一次循环就搞定的原因在于输出只要求值,不要求顺序,也就是[1,2]和[2,1]都是正确答案
46.字母异位词分组
https://leetcode.cn/problems/group-anagrams/description/?envType=study-plan-v2&envId=top-100-liked

public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> map = new HashMap<>();
        for (String str : strs) {
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            String s = Arrays.toString(chars);
            List<String> temp_list = map.getOrDefault(s,new ArrayList<String>());
            temp_list.add(str);
            map.put(s,temp_list);
        }
        return new ArrayList<>(map.values());
    }

总结:这道题的hashmap是把字符串排序后的结果当key,排序后相同的字符串的list当value,很巧妙,而且这道题中注意 map.values()方法返回的是一个Collection<里面是很多value>,这个Conllection不能直接强转为List 下面的代码是错的
ArrayList<List<String>> values = (ArrayList<List<String>>) map.values(); 那么map.values就不能转为List了吗 答案藏在ArrayList的构造方法中 有一个构造方法可以直接把Collection转成ArrayList(ps: LinkedList中一样)

128.最长连续序列
https://leetcode.cn/problems/longest-consecutive-sequence/description/?envType=study-plan-v2&envId=top-100-liked

public int longestConsecutive(int[] nums) {
        Set<Integer> set = new HashSet<Integer>();
        for (int num : nums) {
            set.add(num);
        }
        int len = 0;
        for (Integer num : set) {
            if (set.contains(num - 1)) continue;
            int currentLen = 1;
            while (set.contains(num + 1)){
                num++;
                currentLen++;
            }
            len = Math.max(len,currentLen);
        }
        return len;
    }

总结:在set中添加所有的数字,本题中核心的思想在于:不需要每个数字都从自己判断到top上限,如果set中存在当前数字-1的数字,就把任务交给当前数字-1那个数字的时候再处理

posted @   jeasonGo  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示