哈希表+字符串

news2024/11/30 14:43:11

一)知识回顾:

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

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

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

4)如何让使用哈希表?

4.1)使用语言自带的容器

4.2)使用数组模拟简易哈希表hash<key,nums[index],一般适用于字符串中的字符,可以使用数组下标来模拟字符的ASCILL码值,使用数组值可以是字符的个数,字符的下标,一般可以创建一个100-200个数组即可,这样就会使代码变得非常简洁,因为避免创建容器,使用容器中方法等等

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

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

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

解法2:哈希表hash<nums[i],下标>

当我们固定一个数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<Integer,Integer> result=new HashMap<>();
        for(int right=0;right<nums.length;right++){//先固定最后一个数
            if(result.containsKey(target-nums[right])){//再来枚举第一个数
                return new int[]{result.get(target-nums[right]),right};
            }else{
                result.put(nums[right],right);
            }
        }
        return null;
    }
}

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

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

1)回溯:时间超时

class Solution {
    List<String> 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<array.length;i++){
            if(check[i]==false){
                path.append(array[i]);
                check[i]=true;
                dfs(array);
                check[i]=false;
                path.deleteCharAt(path.length()-1);
            }
        }
    }
    public boolean CheckPermutation(String s1, String s2) {
         char[] array=s1.toCharArray();
         this.check=new boolean[array.length];
         dfs(array);
         return result.contains(s2);
    }
}

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

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

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

三)存在重复元素

217. 存在重复元素 - 力扣(LeetCode)

哈希表:固定一个数right,看看right前面的数有没有出现过array[right],如果出现过直接返回,如果没有出现过就把这个数加入到哈希表中,和之前做两数之和的逻辑是一样的,就是先固定末尾的数找找前面有没有出现过这个数即可

class Solution {
    public boolean containsDuplicate(int[] nums) {
        HashMap<Integer,Integer> result=new HashMap<>();
for(int right=0;right<nums.length;right++){//枚举后面的数,找找这个数在前面有没有出现过
            if(result.containsKey(nums[right])) return true;
            result.put(nums[right],right);
        }
    return false;//说明此时所有的元素都是不重复的
    }
}

四)存在重复元素(2)

219. 存在重复元素 II - 力扣(LeetCode)

这道题相比于上道题来说来说有一个需要注意的点,就是找到最近的一个重复元素,前面的元素就不需要进行考虑的,所以出现重复元素的时候,我们是可以大胆地把之前的元素覆盖掉的,一定不会影响我们的最终结果的

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        HashMap<Integer,Integer> result=new HashMap<>();
        for(int right=0;right<nums.length;right++){
            if(result.containsKey(nums[right])&&(Math.abs(right-result.get(nums[right]))<=k)){
                return true;
            }
            result.put(nums[right],right);//不用担心覆盖掉之前的元素
        }
     return false;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/951318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux——(第二章)Linux的目录结构

VMwear workstations下载及安装 Ubuntu server 18.04安装 VScode下载与安装 使用VS Code连接远程服务器 MobaXterm的下载安装及远程连接 Filezila的下载、安装与使用&#xff08;向服务器传输文件&#xff09; 目录 1.基本介绍 2.Linux目录结构 3.具体目录说明 4.补充 1.基…

从编程语言的角度来理解正则表达式

程序代码是对现实事物处理逻辑的抽象&#xff0c;而正则表达式&#xff0c;则是对复杂的字符匹配程序代码的进一步抽象&#xff1b;也就是说&#xff0c;高度简洁的正则表达式&#xff0c;可以认为其背后所对应的&#xff0c;是字符匹配程序代码&#xff0c;而字符匹配程序代码…

低代码:工业互联网从“学步”到“奔跑”的加速器

一、政策、技术合力推进&#xff0c;工业互联网发展提速 工业制造业曾经创造了我国的崛起神话&#xff0c;最近几年&#xff0c;随着新闻中一些老牌制造业厂商的闭幕&#xff0c;很多人都开始思考&#xff1a;未来工业会是什么样子&#xff1f; 放眼全球&#xff0c;各国对于工…

阿里云轻量应用服务器Linux-Centos7下Oracle19c的安装

初始环境&#xff1a;阿里云轻量应用服务器已经重置系统为CentOS7.3-64位 具体目标&#xff1a;安装Oracle Database 19c 目录 第一步&#xff1a;检查Linux系统版本第二步&#xff1a;下载Oracle19c的安装包第三步&#xff1a;下载Oracle19c的预安装包第四步&#xff1a;上传到…

react学习之路:TS报错-Its return type ‘Element[]‘ is not a valid JSX element

React报错之 Its return type ‘Element[]’ is not a valid JSX element 产生的原因&#xff1a; 1&#xff0c;函数组件返回的是Element数组&#xff0c;不是JSX元素。 2&#xff0c;如果组件返回的是JSX和null以外的值会提示类似’xxx’ cannot be used as a JSX componen…

023 - STM32学习笔记 - 扩展外部SDRAM(二) - 扩展外部SDRAM实验

023- STM32学习笔记 - 扩展外部SDRAM&#xff08;一&#xff09; - 扩展外部SDRAM实验 本节内容中要配置的引脚很多&#xff0c;如果你用的开发板跟我的不一样&#xff0c;请详细参照STM32规格书中说明对相关GPIO引脚进行配置。 先提前对本届内容的变成步骤进行总结如下&…

Breakpad交叉编译aarch64

原本是在mac os上编译的&#xff0c;但是会出现一些问题&#xff0c;因此还是开了台linux容器进行编译&#xff0c;本文可结合之前的linux下编译breakpad共同查看。 Linux下Breakpad编译_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/130754480?…

day3 牛客TOP100:BM 21-30 二分法 二叉树

文章目录 二分法BM21 旋转数组的最小数字BM22 比较版本号力扣-旋转数组的查找力扣-两个非空链表逆序相加 二叉树BM23 二叉树的前序遍历BM24 二叉树的中序遍历BM25 二叉树的后序遍历BM26 求二叉树的层序遍历BM27 按之字形顺序打印二叉树BM28 二叉树的最大深度BM29 二叉树中和为某…

无涯教程-Android - Frame Layout函数

Frame Layout 旨在遮挡屏幕上的某个区域以显示单个项目&#xff0c;通常&#xff0c;应使用FrameLayout来保存单个子视图&#xff0c;因为在子视图彼此不重叠的情况下&#xff0c;难以以可扩展到不同屏幕尺寸的方式组织子视图。 不过&#xff0c;您可以使用android:layout_grav…

Unity——资产包(Asset Bundles)

对很多单机游戏来说&#xff0c;游戏的所有资源往往是与游戏本体一同发布的&#xff0c;资源部西药独立出来。但对于大型商业项目来说&#xff0c;游戏产品还需要再发布之后进行维护和更新&#xff0c;这就引出了Unity资产包的概念 一、资产包&#xff08;Asset Bundles&#x…

推荐几款常用测试数据自动生成工具(适用自动化测试、性能测试)

一、前言 在软件测试中&#xff0c;测试数据是测试用例的基础&#xff0c;对测试结果的准确性和全面性有着至关重要的影响。因此&#xff0c;在进行软件测试时&#xff0c;需要生成测试数据以满足测试场景和要求。本文将介绍如何利用测试数据生成工具来快速生成大量的测试数据…

【Windows打开OpenSSH服务端支持】

文章目录 概要整体架构流程技术细节1.安装OpenSSH服务端2.设置自启动3.启动服务4.资源监视器 修改配置防火墙小结 概要 项目需要装了一个Windows Server 2022&#xff0c;由于不能亲自到场调试&#xff0c;我就打开了OpenSSH服务支持&#xff0c;给有需要的小伙伴参考下。 整…

飞天使-python的分支结构,循环,函数

文章目录 分支结构单分支双分支多分支内联if条件语句案例&#xff0c;门票价格 循环for,in 循环for in 次数控制while 循环while遍历跳出循环break跳出循环continue 函数函数概念内置函数自定义函数函数进阶作用域 参考视频 分支结构 单分支 对事情判断&#xff0c;然后做出选…

08-Vue基础之组件

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

搬家快递服务小程序的便利性

在当今快节奏的生活中&#xff0c;搬家可能是很多人都需要面对的问题。无论是新房子还是新办公室&#xff0c;都需要高效、便捷的搬家服务。本文将介绍如何使用第三方小程序制作平台&#xff0c;如乔拓云平台&#xff0c;开发一款高效便捷的搬家服务小程序。 1. 注册登录第三方…

Muscles|Tissue —— 介绍

BETA —— 此功能仍然在开发测试中&#xff0c;相关文档很少或没有&#xff0c;使用时需注意&#xff1b; 可使用Vellum-based Muscles & Tissue系统&#xff0c;模拟角色的肌肉、组织、及皮肤&#xff1b;可轻易导入模型和动画&#xff0c;并快速配置解算模拟&#xff1b;…

LeetCode第26~30题解

CONTENTS LeetCode 26. 删除有序数组中的重复项&#xff08;简单&#xff09;LeetCode 27. 移除元素&#xff08;简单&#xff09;LeetCode 28. 找出字符串中第一个匹配项的下标&#xff08;简单&#xff09;LeetCode 29. 两数相除&#xff08;中等&#xff09;LeetCode 30. 串…

Python基础知识学习与回顾

Python学习 Python基本语法 标识符 标识符由数字、字符串、下划线构成。 注意事项&#xff1a; 标识符不以数字开头区分大小写下划线开头的标识符具有特殊意义保留字&#xff0c;Python保留了一些关键字&#xff0c;这些关键字都是通过小写字母进行保存。 下划线开头的特…