LeetCode Hot100 哈希

概述

我觉得这个模块就是为了让你知道哈希的用法

哈希:我觉得就是唯一的那种特性

哈希表的话就是类似一个函数,一个映射,所以我觉得它可以快速给我们对应的值

第一题

两数之和

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1:

复制代码
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

复制代码
输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

复制代码
输入:nums = [3,3], target = 6
输出:[0,1]

方法一:可以直接暴力破解,时间复杂度就是O(n²)

但是这个不太符合哈希

方法二:

使用HashMap

java 复制代码
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < nums.length; i++) {
            if(map.containsKey(target - nums[i])) {
                return new int[]{map.get(target - nums[i]), i};
            }
            map.put(nums[i], i);
        }
        return null;
    }
}

首先你创建一个哈希表,key存储数组的值,value存对应的下标索引

在你遍历数组进行哈希表的put的时候判单是否已经存在值为target - numsi的元素,如果存在的话,直接返回这两个下标,这样就得到了这道题的答案。

注意点:

put一定是要放在判断之前,否则就会碰到两个一样的元素,因为不允许相同元素。

第二题

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

示例 1:

输入: strs = "eat", "tea", "tan", "ate", "nat", "bat"

输出:\["bat","nat","tan","ate","eat","tea"]

解释:

  • 在 strs 中没有字符串可以通过重新排列来形成 "bat"。
  • 字符串 "nat" 和 "tan" 是字母异位词,因为它们可以重新排列以形成彼此。
  • 字符串 "ate" ,"eat" 和 "tea" 是字母异位词,因为它们可以重新排列以形成彼此。

示例 2:

输入: strs = ""

输出:\[""]

示例 3:

输入: strs = "a"

输出:\["a"]

这个就是字母异或表示的,这个哈希思想更加的强,

初始化:新建哈希表 key是原数组元素字符串的排序状态sorted,

然后值就是对应排序前的字符串的列表

java 复制代码
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> ans = new ArrayList<>();
        Map<String, List<String>> m = new HashMap<>();
        for(String s : strs) {
            String key = sortString(s);
            if(!m.containsKey(key)) {
                m.put(key, new ArrayList<>());
            }
            m.get(key).add(s);
        }
        for(String s : m.keySet()) {
            ans.add(m.get(s));
        }
        return ans;
    }
    private String sortString(String s) {
        char[] chars = s.toCharArray();
        Arrays.sort(chars);
        return new String(chars);
    }
}

辅助函数,这里面是排序字符串,然后返回一个新的字符串

首先遍历字符串数组,然后把新建一个key存储它排好序的值,value就放入它原来的值

然后判单这个put的是否已经存在,如果存在就放进它的list集合,不存在就put进哈希表

最后把每个小列表取出,再放进一个大列表返回

这里面更加快捷的方法是使用:

map.computeIfAbsent()方法,直接可以省去很多行代码。

第三题

java 复制代码
class Solution {
    public int longestConsecutive(int[] arr) {
        
        int[] nums = Arrays.stream(arr).distinct().sorted().toArray();//这里是把原数组变成去重排数组
        //如果长度小于等于1,直接返回长度
        if(nums.length <= 1) {
            return nums.length;
        }
        //这里就是判断最大的连续长度,如果后一个减去前一个等于1的话,说明这两个数字是连续的
        int ans = 0;
        int cnt = 1;
        for(int i = 1; i < nums.length; i++) {
            if((nums[i] - nums[i-1] == 1)) {
                cnt++;
            } else {
                cnt = 1;
            }
            ans = Math.max(ans, cnt);
        }
        return ans;
    }
}

这里面使用了stream流快速去重和排序,可以试试

其他的看注释,我觉得这个方法虽然效率不高,但是我的独特思路,大家可以参考一下

相关推荐
蒸蒸yyyyzwd1 小时前
从邓明学习的后端笔记
笔记·学习
文丑颜不良啊1 小时前
LeetCode2861~2880题目解析
java·leetcode
机器学习之心1 小时前
基于变量相关图与残差学习的 GCN 多变量回归方法——混凝土 28 天抗压强度预测
学习·回归·gcn
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
在所不辞兄2 小时前
为什么在新能源汽车电驱与热管理开发中,AI驱动的数字孪生和数据驱动仿真正在部分替代对物理台架与实车标定的依赖?
人工智能·深度学习·神经网络·算法·机器学习
I_belong_to_jesus13 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla14 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
Gary移动存储固件14 小时前
eMMC5.1协议中文学习讲解(6.6.17~6.6.22.4.6)
学习·ufs·emmc·nand·存储固件
一个天蝎座 白勺 程序猿15 小时前
别让收藏夹替你学习:我搭AI知识体系的完整方法,脚本直接拿去用
人工智能·学习·ai·ai学习
楚山之石16 小时前
【Nat Biomed Eng】Connectome 2.0 超高梯度扫描仪:500 mT/m 与 600 T/m/s 把活体人脑微观结构分辨推进到亚微米级
图像处理·学习·数据分析·mri