哈希表+字符串

一)知识回顾:

1)哈希表是什么?哈希表是存储数据的容器

2)哈希表有啥用?快速的查找某一个元素

3)什么时候使用哈希表?频繁的查找某一个数的时候,当我们快速查找某一个数的时候,不光要想到哈希表还需要想到二分查找,但是二分查找算法的局限性太强了,必须数组中有序或者是数组中出现二段性的时候才会使用到二分

4)如何让使用哈希表?

4.1)使用语言自带的容器

4.2)使用数组模拟简易哈希表hash这样就会使代码变得非常简洁,因为避免创建容器,使用容器中方法等等

4.3)但数据范围小的时候:1-10^2~3~4~4~5,但是当出现负数不建议使用数组

二)常见算法题:

一)两数之和:

1. 两数之和 - 力扣(LeetCode)

解法1:暴力枚举O(N^2)

1)我们首先每一次先固定一个数left,然后从这个数(不包含array[left])后面找到right下标的数使得array[left]+array[right]==target

哈希表+字符串_第1张图片

2)我们可以先固定最后一个数nums[right],然后从这个数前面的数进行寻找nums[left]+nums[right]==target

哈希表+字符串_第2张图片

暴力解法慢的原因就是每当我们固定一个数nums[index]之后,需要在这个数前面寻找target-nums[index]的数,此时还是需要使用遍历的方式进行查找,而如果我们要是使用哈希表的话,就可以快速找到要检索的元素

解法2:哈希表hash

当我们固定一个数right的时候,可以在哈希表中找到target-nums[right]的值,因为此时哈希表中存的都是nums[right]之前的数,这样就很好的规避了找到两个相同的数相加等于target,当没有找到的时候可以将nums[right]加入到哈希表中,right++,直到找到最终的结果即可

为什么之前的暴力策略不太好用呢?

之前使用的暴力策略是首先每一次先固定一个数left,然后从这个数(不包含array[left])后面找到right下标的数使得array[left]+array[right]==target,是需要将nums[left]后面的数(不包括nums[left])的数全部加入到哈希表中,如果是这样的话,是需要一开始将所有的数都加入到哈希表中,[2,4,5,8],target=8,此时再来进行模拟就可能找到两个4相加等于8,可能自己找到自己了,所以还是需要特殊的进行判断的

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap result=new HashMap<>();
        for(int right=0;right

二)判断是否互为字符重排:

面试题 01.02. 判定是否互为字符重排 - 力扣(LeetCode)

1)回溯:时间超时

class Solution {
    List result=new ArrayList<>();
    boolean[] check;
    StringBuilder path=new StringBuilder();
    public void dfs(char[] array){
        if(path.length()==array.length) {
             result.add(path.toString());
             return;
        }
        for(int i=0;i

 2)使用官方提供的哈希表

哈希表+字符串_第3张图片

3)使用数组模拟的哈希表来解决这道问题

哈希表+字符串_第4张图片

4)只使用一个哈希表来解决这道问题

哈希表+字符串_第5张图片

你可能感兴趣的:(散列表,数据结构)