【LeetCode 热题 100】(一)哈希

瑞萨RZN2L工业以太网开发避坑指南:EtherCAT从入门到通信调试全流程 本文详细解析了瑞萨RZN2L MPU在工业以太网开发中的EtherCAT从站配置与通信优化全流程。通过硬件设计关键点、协议栈选型、PDO映射策略及DC同步精度优化等实战技巧,帮助开发者快速搭建高效通信框架并解决调试中的常见问题,特别适合工业自动化领域的实时通信需求。 阅读详情

1. 两数之和

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int length = nums.length;
        // 1.声明一个hashmap {nums[i], i}
        HashMap<Integer, Integer> map = new HashMap<>();

        for (int i = 0; i < length; i++) {
            int second = target - nums[i];
            if(map.containsKey(second)){
                int j = map.get(second);
                return new int[]{i,j};
            }
            map.put(nums[i],i);
        }
        return new int[]{};     
    }
}

这段代码实现了在整数数组 nums 中找到两个数,使它们的和等于给定的目标值 target,并返回这两个数的索引。其解题思路基于 哈希表优化查找效率,具体步骤如下:

解题思路描述:

  1. 初始化哈希表:

    • 创建一个 HashMap<Integer, Integer>,键(Key)存储数组元素的值,值(Value)存储该元素的索引。
    • 目标:通过值快速查找对应的索引。
  2. 遍历数组:

    • 对每个元素 nums[i],计算其配对值 second = target - nums[i](即满足 nums[i] + second = target 的值)。
  3. 检查配对值是否存在:

    • 在哈希表中查找 second:
      • 若存在:说明 second 是之前遍历过的某个元素的值,其索引 j = map.get(second) 与当前索引 i 即为解。
      • 直接返回 {i, j}(顺序为 i 在后,j 在前)。
    • 若不存在:将当前值 nums[i] 及其索引 i 存入哈希表,继续遍历。
  4. 遍历结束处理:

    • 若循环结束未找到解,返回空数组 {}(题目保证有解,此步为语法完整性)。

关键点分析:

  • 高效查找:哈希表在平均 O(1) 时间内完成 containsKey 和 get 操作,将整体时间复杂度优化至 O(n)。
  • 避免重复使用:先检查配对值再存入当前值,确保不会将同一元素使用两次(例如 target = 4, nums[i] = 2 时,先检查 2 是否已存在,再存入当前 2)。
  • 顺序无关:返回索引顺序取决于遍历顺序(j 为哈希表中存储的较早索引,i 为当前索引)。

示例说明:

  • 输入:nums = [3, 2, 4], target = 6
  • 步骤:
    1. i=0:nums[0]=3 → second=3(6-3),哈希表为空 → 存入 (3,0)。
    2. i=1:nums[1]=2 → second=4(6-2),哈希表无 4 → 存入 (2,1)。
    3. i=2:nums[2]=4 → second=2(6-4),哈希表存在 2(索引 j=1)→ 返回 {2, 1}。

复杂度:

  • 时间复杂度:O(n),遍历数组一次。
  • 空间复杂度:O(n),哈希表存储最多 n 个元素。

此方法以空间换时间,高效解决了“两数之和”问题。

49. 字母异位词分组

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
           HashMap<String, List<String>> map = new HashMap<>();


        for (String item : strs) {
            // 1. 声明字母数组
            int[] count1 = new int[26];
            // 2. 将字母转换位对应的ascii 存储到数组下标
            for (int i = 0; i < item.length(); i++) {
                char c = item.charAt(i);
                int poi = c - 'a';
                count1[poi] = count1[poi] + 1;
            }
            // 3. 在将数组下标转换位字母
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 26; i++) {
                if(count1[i] != 0){
                    sb.append((char) (i + 'a'));
                    sb.append(count1[i]);
                }
            }
            // 4. 判断map中键中是否包含
            String key = sb.toString();
            List<String> list1 = map.getOrDefault(key, new LinkedList<>());
            list1.add(item);
            map.put(key, list1);
        }
        List<List<String>> list = new LinkedList<>(map.values());

        return list;
        
    }
}

解题思路描述

这段代码实现了将一组字符串按字母异位词(Anagram) 分组的功能。字母异位词指字母相同但排列不同的字符串(如 “eat” 和 “tea”)。核心思路是 为每个字符串生成唯一的特征编码作为哈希表的键,具体步骤如下:


1. 初始化哈希表
HashMap<String, List<String>> map = new HashMap<>();
  • 键(Key):字符串的特征编码(字母出现频次的唯一标识)
  • 值(Value):所有具有相同特征编码的字符串组成的列表

2. 遍历所有字符串

对每个字符串 item 执行以下操作:

for (String item : strs) {
    // 步骤2.1 ~ 2.4
}
2.1 统计字母频次
int[] count1 = new int[26];
for (int i = 0; i < item.length(); i++) {
    char c = item.charAt(i);
    int poi = c - 'a';  // 将字母映射到 0-25 的索引
    count1[poi]++;      // 对应字母计数+1
}
  • 创建长度 26 的数组(对应 a-z)
  • 遍历字符串中的每个字符,在数组中记录其出现次数
2.2 生成特征编码(关键步骤)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 26; i++) {
    if(count1[i] != 0){
        sb.append((char) (i + 'a')); // 添加字母
        sb.append(count1[i]);        // 添加出现次数
    }
}
String key = sb.toString();
  • 将统计数组转换为唯一字符串标识(如 “a2b1” 表示 a 出现 2 次,b 出现 1 次)
  • 为什么有效:
    字母异位词的统计结果相同 → 生成的 key 相同
    非字母异位词统计结果不同 → 生成的 key 不同
2.3 分组存储到哈希表
List<String> list1 = map.getOrDefault(key, new LinkedList<>());
list1.add(item);
map.put(key, list1);
  • 若 key 不存在:创建新列表
  • 若 key 已存在:获取现有列表
  • 将当前字符串添加到对应列表

3. 返回分组结果
return new LinkedList<>(map.values());
  • 哈希表的 values() 就是所有分组结果
  • 直接转换为列表返回(每个子列表是一组字母异位词)

关键优势

  1. 精确分组
    通过字母频次统计确保只有字母异位词共享同一 key
  2. 避免排序
    相比对每个字符串排序(O(klogk)),统计频次只需 O(k)(k 为字符串长度)
  3. 哈希表高效操作
    插入和查询操作均摊时间复杂度 O(1)

复杂度分析

  • 时间复杂度:O(n × k)
    • n:字符串数组长度
    • k:最长字符串长度(每个字符串需遍历统计)
  • 空间复杂度:O(n × k)
    • 哈希表存储所有字符串的特征编码和分组列表

示例说明

输入:["eat", "tea", "tan"]
处理过程:

  1. “eat” → 统计:a1,e1,t1 → 特征码:“a1e1t1”
  2. “tea” → 统计:a1,e1,t1 → 特征码:“a1e1t1” → 与 “eat” 同组
  3. “tan” → 统计:a1,n1,t1 → 特征码:“a1n1t1” → 新分组
    输出:[ ["eat","tea"], ["tan"] ]

128. 最长连续序列

class Solution {
    public int longestConsecutive(int[] nums) {
        int max_long = 0;

        Set<Integer> hashSet = new HashSet<>();
        for (int num : nums) {
            hashSet.add(num);
        }

        for (int num : hashSet) {
            // 1.判断当前的前一位是否在集合中
            if(!hashSet.contains(num - 1)){
                int curr_num = num;
                int current_long = 1;
                // 2.全局最大的子序列和当前子序列长度
                while (hashSet.contains(curr_num + 1)){
                    curr_num = curr_num + 1;
                    current_long = current_long + 1;

                }
                max_long = Math.max(current_long, max_long);
            }
        }
        return max_long;

    }
}

解题思路描述

这段代码实现了在未排序整数数组中寻找最长连续序列长度的功能。核心思路是 利用哈希集合实现高效查找,并通过 跳过非连续序列起点 避免重复计算,具体步骤如下:


1. 初始化哈希集合
Set<Integer> hashSet = new HashSet<>();
for (int num : nums) {
    hashSet.add(num);
}
  • 将所有数字存入哈希集合,实现 O(1) 时间复杂度的查找
  • 自动去除重复元素,避免冗余处理

2. 寻找连续序列起点
for (int num : hashSet) {
    if(!hashSet.contains(num - 1)) { // 关键判断
        // 处理连续序列...
    }
}
  • 核心思想:只从连续序列的起点开始计算
  • 判断条件:num-1 不存在于集合中 → 说明 num 是某个连续序列的最小值(起点)
  • 为什么有效:
    若非起点(如 num=3 时 num-1=2 存在),说明它属于某个更长序列的中间部分,后续会被起点覆盖计算

3. 扩展连续序列
int curr_num = num;
int current_long = 1;
while (hashSet.contains(curr_num + 1)) {
    curr_num++;          // 移动到下一个数字
    current_long++;      // 序列长度+1
}
  • 从起点 num 开始向后扩展序列(num, num+1, num+2,...)
  • 每找到一个连续后继数字:
    • 移动当前数字指针 curr_num
    • 增加当前序列长度 current_long
  • 当 curr_num+1 不存在时,序列终止

4. 更新全局最大值
max_long = Math.max(current_long, max_long);
  • 比较当前序列长度与历史最大值
  • 始终保持 max_long 为遍历过程中的最大序列长度

5. 返回结果
return max_long;
  • 返回全局最长连续序列长度

关键优势

  1. 高效去重
    使用 HashSet 自动处理重复元素,避免无效计算
  2. 起点优化策略
    仅从序列起点开始扩展,确保每个连续序列只计算一次
  3. 时间复杂度优化
    看似嵌套循环,实际每个元素最多被访问两次(集合构建+序列扩展),整体 O(n) 复杂度

复杂度分析

  • 时间复杂度:O(n)
    • 集合构建:O(n)
    • 序列扩展:每个元素最多被内层循环访问一次
  • 空间复杂度:O(n)
    • 哈希集合存储所有元素

示例说明

输入:[100, 4, 200, 1, 3, 2]
处理过程:

  1. 构建集合:{1, 2, 3, 4, 100, 200}
  2. 遍历元素:
    • 100:99不存在 → 起点 → 向后扩展:101不存在 → 长度=1
    • 4:3存在 → 非起点 → 跳过
    • 200:199不存在 → 起点 → 向后扩展:201不存在 → 长度=1
    • 1:0不存在 → 起点 → 向后扩展:2,3,4存在 → 5不存在 → 长度=4
    • 2和3:非起点 → 跳过
  3. 返回最大值:4(序列 1→2→3→4)
DeepSeek研发的精算大模型「精卫」已实现98%精算任务覆盖,中国人寿采用后年节约3.2亿元技术采购成本,形成关键技术替代效应 根据现有资料,精算领域关键技术替代效应的行业标准定义尚未明确具体提及。然而,可以从相关文献中提取一些关键概念和方法来推导出可能的定义。​替代效应的基本定义​:替代效应是指一种商品价格变动引起另一种商品的相对价格变动,从而导致消费者在维持原有效用水平不变的条件下对商品需求量做出的调整。​技术替代效应​:在精算领域,技术替代效应可以理解为新技术或新方法对现有技术或方法的替代,从而影响精算模型、数据处理和决策过程。例如,机器学习在精算中的应用日益增长,改变了精算师的工作方式和模型构建方法。​。 阅读详情

相关推荐

bartender 10.1破解版|bartender条码打印10.1

点击下载出处:BarTender10.1破解版 bartender10.1破解版是一款专业的条码打印软件,在行业内广受好评,通过使用bartender我们可以将标签设计这个复杂的过程变得更简便,在设计中快速调整,即刻打印,非常迅速,BarTender10.1破解版不仅支持的标签类型包括EPC Class 1 、Gen2 、ISO 18000-6b 、ISO 15693 、Tag-It 、I-CO...

weixin_44924147的博客 6万+

LeetCode 热题100(一)【哈希】

例如对于单词“eat”,“tea”,“ate”,对其进行排序后,均为“aet”,令MyMap的key为aet,则有MyMap[aet] = {“eat”,“tea”,“ate”};2.对于100来说,num_set中不存在99,则100为连续序列的起始数,当前序列数为1,在num_set寻找是否存在101,不存在,当前最大序列数为1。4.对于200,num_set中不存在199,则200为连续序列的起始数,当前序列数为1,在num_set寻找是否存在201,不存在,当前最大序列数为1。

jrrz0828的博客 1177

Labview实现服务器(server)与多客户端(clients)通信

服务器可以接收多个客户端发送的消息,并显示消息来源。 服务器可以发送消息到指定客户端 客户端可以自动连接服务器,断连后重连 客户端可以发送消息到服务器,可接收服务器消息 类似框架可以用做中央服务器及客户端项目

u013809089的博客 7973

LeetCode 热题 100 题解(一):哈希部分

如果说当前遍历到 7,从开头到 7 是否遍历过 2 即可;但是这样每次都要从头开始遍历,时间开销比较大。 那能不能通过一个映射关系将每个数据是否出现和出现的位置存储下来,然后通过查询这个映射关系,来快速得知数组中是不是存在这个元素了呢? 比如上面的情况,当遍历到 2,先查询前面是否遍历到过 target - 2,如果没有就将 2 存储下来,并且与其出现的位置做一个映射;此时当遍历到 7 的时候,就可以通过查询这个映射来得知 2 是否出现过和其最后一次出现的下标是什么了。

kkq的博客 1348

从公式到实践:用SPSS解锁香农多样性指数的生态洞察

本文详细介绍了如何利用SPSS软件计算和应用香农多样性指数进行生态研究。从基础公式解析到SPSS实战操作,再到生态决策支持,全面展示了该指数在物种丰富度和均匀度量化中的价值。文章特别强调了SPSS操作中的关键技巧和常见误区,为生态研究者提供了一套完整的分析解决方案。

weixin_30832143的博客 465

STM32G474实战:数字LLC电源控制程序从零到跑通(附完整代码解析)

本文详细介绍了基于STM32G474微控制器开发数字LLC电源控制程序的完整实战流程。从硬件平台搭建、CubeMX工程配置,到核心控制逻辑、双速率中断框架、数字PID实现,再到Burst模式、状态机等高级策略与异常处理,提供了从零到跑通的系统化指南与代码解析,助力开发者掌握高效数字电源的程序编写与调试技巧。

s1t2u3的博客 1237

(一)LeetCode热题100——哈希

专题hash

qq_74276498的博客 472

VirtualBox 7.0.8 + Android-x86 9.0 保姆级安装教程(附图形界面卡顿解决方案)

本文提供VirtualBox 7.0.8与Android-x86 9.0的详细安装教程及性能优化方案,帮助开发者解决图形界面卡顿问题。从环境准备到高级配置,涵盖硬件要求、安装步骤、显存优化及ADB调试等实用技巧,显著提升虚拟机流畅度,适用于应用测试和开发调试。

weixin_29224309的博客 523

LeetCode热题100 【cpp】题解(一)哈希表和双指针

cpp题解

阿正的梦工坊 1014

基于C#的机器人控制框架:如何将ROS与硬件集成

本文探讨了如何利用C#与ROS(Robot Operating System)集成开发机器人控制系统。通过ROSSharp库和rosbridge中间件,实现了C#与ROS的WebSocket通信,并展示了硬件控制模块的设计方法。文章详细介绍了电机控制的串口通信实现、ROS消息订阅机制,以及性能优化和容错处理策略,最终构建了一个智能小车控制框架的案例。这种C#与ROS的集成方案为机器人开发提供了跨平台支持,同时兼顾了系统的高效性和可靠性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1138

Unreal5从入门到精通之Landscape地形系统

虚幻引擎 5 (UE5) 能够利用其强大的地形编辑工具套件创建大规模的地形世界。使用地形工具可以创建身临其境的户外地形,这些地形经过优化,可在多种不同设备上保持可播放的帧速率。

TxNet 4141

LeetCode热题100——哈希(一句话题解及复杂度分析)

LeetCode热题100——哈希(一句话题解及复杂度分析)

m0_53805404的博客 264

基于深度学习YOLOv8的商品识别系统(深度学习 + UI界面 + 训练数据集 + Python代码)

如果使用自定义数据集,可以通过图像标注工具如LabelImg来标注每个商品的类别和边界框,并保存为YOLO格式的文本文件。bash复制编辑/dataset/images/train/val/labels/train/val这样,我们就准备好了数据集,可以开始训练YOLOv8模型。本文介绍了如何使用YOLOv8构建一个商品识别系统,包括从数据准备到模型训练,再到UI界面的开发。通过深度学习技术,尤其是YOLOv8的高效目标检测能力,我们能够快速实现商品识别并集成到实际应用中。

YOLO 302

LeetCode 热题 HOT100(一):哈希表与双指针入门(Go 实现)

(欢迎来访)✨本文覆盖力扣「热题 100」学习计划前 5 题,全部使用实现。

lihaoweiwudi_的博客 796

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LeetCode热题100道:分享(一)1-12题( 哈希、双指针、滑动窗口、子串)

本文是作者在学习与刷题过程中遇到的问题总结与经验分享,难免有不足之处,诚挚欢迎大家的批评与指正。

m0_67589172的博客 977

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法一)定长滑动窗口+哈希表

Problem:题目:给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

最短的捷径就是绕远路,绕远路才是我的最短捷径。 1171

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LeetCode 热题 100(一):哈希。49. 字母异位词分组、128. 最长连续序列。

49. 字母异位词分组、128. 最长连续序列。

xiaomingming99的博客 567

【力扣热题100】哈希——两数之和

本文介绍了LeetCode上"两数之和"问题的两种解法。暴力解法通过双重循环枚举所有可能的数字组合,时间复杂度为O(n²)。优化解法利用哈希表存储已遍历数字及其下标,只需一次遍历即可找到符合条件的数字对,时间复杂度降低到O(n)。题解给出了Java实现代码,通过HashMap记录数字和索引,在遍历时检查是否存在目标差值,从而快速定位结果。该解法既提高了效率又节省了空间。

soul7y的博客 321

LeetCode 热题 100 子串

LeetCode Hot 100中与子串相关的题目,解题思路,代码实现讲解。

有耐心做好简单事情,坚持写blog 886

LeetCode热题100(二十五)——141.环形链表

【代码&解析】LeetCode热题100(二十五)——141.环形链表

Young_4的博客 1031

LeetCode 热题 100 算法题解 - 49. 字母异位词分组

方法一实现更简单,适合字符串长度较小的情况。方法二在理论上更高效,适合字符串长度较大的场景。掌握这两种方法有助于应对不同约束条件下的类似问题。在实际应用中,可以根据具体需求选择最合适的方法。

lcgsmile的博客 376

LeetCode 热题 100 堆

LeetCode Hot 100 中与堆算法相关的题目,解题思路,代码实现讲解。

有耐心做好简单事情,坚持写blog 592

LeetCode热题100(二十六) —— 142.环形链表II

【代码&解析】LeetCode热题100(二十六) —— 142.环形链表II

Young_4的博客 1913

LeetCode热题100--383

LeetCode 383题要求判断赎金信字符串ransomNote是否能由杂志字符串magazine中的字符构成。通过统计magazine中各字符出现次数,然后检查ransomNote中的每个字符是否都能在magazine中找到足够数量的对应字符。使用大小为26的整型数组记录字符频次,时间复杂度O(n+m),空间复杂度O(1)。关键点在于遍历ransomNote时检查字符剩余数量是否足够,若任意字符不足立即返回false。

weixin_66162442的博客 262

LeetCode 热题 100——day3 最长连续序列

摘要: 文章分享了LeetCode「最长连续序列」的两种哈希表解法。方法一利用unordered_map合并连续区间,通过更新左右边界计算长度;方法二使用unordered_set从序列起点向后查找。两种方法均实现O(n)时间/空间复杂度。博主推荐了更巧妙的哈希表合并区间法,代码简洁高效。文末对比了两种思路,适合算法学习者参考解题策略。

梦是现实的延续,现实是梦的结束。 271

力扣热题100之环形链表 II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。

weixin_64233807的博客 350
上一篇: 【黑马SpringCloud微服务开发与实战】(八)MQ高级
下一篇: 【LeetCode 热题 100】(二)双指针
夜斗小神社
博客等级 码龄7年 3718粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值