优选算法-哈希表

算法原理

1.哈希表是什么?

哈希表是存储数据的容器

2.有啥用?

"快速"查找某个元素(最多可以达到O(1))

3.什么时候用?

当我们频繁的查找某一个数时,可以用哈希表,也可以用二分

4.怎么用?

1.容器(哈希表)

2.用数组模拟简易哈希表(字符串中的"字符",数据范围很小的时候)

题目解析

1.两数之和

https://leetcode.cn/problems/two-sum/description/

题目描述

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

例如: nums=[2,7,11,15] t=9 输出:[0,1]

算法原理

解法一:暴力枚举(固定一个数,往前加)

解法二:哈希表做优化

2,7,11,15\] t=9 将11扔进哈希表的时候,因为t=9,所以我们要找t=-2,在哈希表中找 #### 代码实现 ```java class Solution { public int[] twoSum(int[] nums, int target) { Map map=new HashMap<>(); int n=nums.length; for(int i=0;itrue #### 算法原理 s1每个字符出现个数与s2中每个字符出现次数,完全相同 hash1-\>存s1 hash2-\>存s2 用数组模拟 策略二:只使用一个哈希表-\>只统计s1,遍历s2再减,有负数返回false 如果字符串长度不相等直接false #### 代码实现 ```java class Solution { public boolean CheckPermutation(String s1, String s2) { if(s1.length()!=s2.length()){ return false; } int[] hash=new int[26]; for(int i=0;itrue \[1,2,3,4\]-\>false #### 算法原理 和T1找两数之和类似(这里我们就是相当于找nums\[i\]) #### 代码实现 ```java class Solution { public boolean containsDuplicate(int[] nums) { Set set=new HashSet<>(); for(int x:nums){ if(set.contains(x)){ return true; } set.add(x); } return false; } } ``` ### 4.存在重复元素二 [https://leetcode.cn/problems/contains-duplicate-ii/description/](https://leetcode.cn/problems/contains-duplicate-ii/description/ "https://leetcode.cn/problems/contains-duplicate-ii/description/") #### 题目描述 给定nums和一个k,判断数组中是否存在两个不同索引i和j,满足nums\[i\]==nums\[j\],且abs\[i-j\]\<=k,存在返回-\>true,不存在,返回-\>false eg:\[1,2,3,1\] k=3-\>返回true \[1,0,1,1\] k=1 返回true #### 算法原理 \[1,0,0,1,3,1,4\] k=2 hash\ 第一个Integer存的是nums\[i\],第二个Integer存的是i(可以覆盖,因为题上要求abs(绝对值)) #### 代码实现 ```java class Solution { public boolean containsNearbyDuplicate(int[] nums, int k) { Map hash=new HashMap<>(); for(int i=0;i

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

算法原理

解法:哈希表

1.判断2个字符串是否是字母异位词(排序)

2.如何分组<String,String[]>

"aet"->"eat","tea","ate"

"ant"->"tan","nat"

"abt"->"bat"

代码实现

java 复制代码
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> hash=new HashMap<>();
        for(String s:strs){
            char[] tmp=s.toCharArray();
            Arrays.sort(tmp);
            String str=new String(tmp);
            if(!hash.containsKey(str)){
                hash.put(str,new ArrayList<>());
            }
            hash.get(str).add(s);
        }
        return new ArrayList(hash.values());
    }
}
相关推荐
IronMurphy5 小时前
【算法四十三】279. 完全平方数
算法
墨染天姬5 小时前
【AI】Hermes的GEPA算法
人工智能·算法
papership6 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826526 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
山甫aa6 小时前
差分数组 ----- 从零开始的数据结构
数据结构
早日退休!!!6 小时前
《数据结构选型指南》笔记
数据结构·数据库·oracle
Beginner x_u7 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
丑八怪大丑7 小时前
Java数据结构与集合源码
数据结构
_深海凉_10 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
旖-旎10 小时前
深搜练习(电话号码字母组合)(3)
c++·算法·力扣·深度优先遍历