跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

力扣面试题解析:哈希表与双指针算法

哈希表与双指针是解决数组与字符串问题的核心算法思想。哈希表部分涵盖两数之和、字母异位词分组及最长连续序列,利用字典映射和集合去重优化查找效率。双指针部分介绍移动零、盛水最多的容器和三数之和,通过快慢指针或左右指针协同移动降低时间复杂度。内容包含详细 Python 代码示例与逻辑分析,适合算法复习与面试准备。

性能调优发布于 2026/3/16更新于 2026/5/2827 浏览

哈希表

哈希表(散列表)是一种通过键值对映射来高效存储和查找数据的数据结构。其核心思想是使用一个哈希函数,将键(Key)转换为数组索引,从而直接定位对应的值,实现 O(1) 时间复杂度的增删改查。

特性:高效读写、基于哈希函数映射、处理哈希冲突(链地址法、开放寻址法)、空间换时间、无序性

1. 两数之和

给定整数数组 nums 和目标值 target,找出和为目标值的两个整数并返回下标。

  • 使用字典存储值和对应的索引
class Solution(object):
    def twoSum(self, nums, target):
        num_map = {}
        for index, num in enumerate(nums):
            x = target - num
            if x in num_map:
                return [num_map[x], index]
            num_map[num] = index

2. 字母异位词分组

将字符串数组中的字母异位词组合在一起。

  • 生成特征键:为相似元素找唯一标识
  • 方法:排序法、计数法
  • 排序法:key = ''.join(sorted(x))
class Solution(object):
    def groupAnagrams(self, strs):
        list1 = {}
        for x in strs:
            key = ''.join(sorted(x))
            if key not in list1:
                list1[key] = []
            list1[key].append(x)
        return list(list1.values())

3. 最长连续序列

在未排序整数数组中找出数字连续的最长序列长度。

  1. 转集合去重
  2. 遍历集合,若 num-1 不存在则 num 为起点
  3. 从起点向后查找连续数字
  4. 维护最大长度
class Solution(object):
    def longestConsecutive(self, nums):
        num_set = set(nums)
        max_length = 0
        for num in num_set:
            if num - 1 not in num_set:
                current_num = num
                current_length = 1
                while current_num + 1 in num_set:
                    current_num += 1
                    current_length += 1
                if current_length > max_length:
                    max_length = current_length
        return max_length

双指针

在数组或链表上使用两个指针协同移动,减少重复计算。指针可同向或相向移动。

类型:快慢指针(判断环、中间节点)、左右指针(两数之和、反转数组)、滑动窗口(最长无重复子串) 特性:时间效率高、空间复杂度低、适合有序数组/区间类问题

1. 移动零

将所有 0 移动到末尾,保持非零元素相对顺序。

  • 慢指针:记录非零元素放置位置
  • 快指针:遍历寻找非零元素
  • 交换并右移
class Solution(object):
    def moveZeroes(self, nums):
        slow = 0
        for fast in range(len(nums)):
            if nums[fast] != 0:
                nums[slow] = nums[fast]
                slow += 1
        for x in range(slow, len(nums)):
            nums[x] = 0
        return nums

2. 盛水最多的容器

给定高度数组 height,求两条线与 x 轴构成的最大面积。

  • 初始指针:左头右尾
  • 面积由最短边决定
  • 移动较短边的指针
class Solution(object):
    def maxArea(self, height):
        left, right = 0, len(height) - 1
        max_area = 0
        while left < right:
            current_area = min(height[left], height[right]) * (right - left)
            if current_area > max_area:
                max_area = current_area
            if height[left] < height[right]:
                left += 1
            else:
                right -= 1
        return max_area

3. 三数之和

返回所有和为 0 且不重复的三元组。

  • 排序预处理
  • 固定第一个数,双指针找另外两个
  • 去重处理
class Solution(object):
    def threeSum(self, nums):
        nums.sort()
        result = []
        n = len(nums)
        for i in range(n):
            if nums[i] > 0:
                break
            if i > 0 and nums[i] == nums[i - 1]:
                continue
            left, right = i + 1, n - 1
            target = -nums[i]
            while left < right:
                current_num = nums[left] + nums[right]
                if current_num == target:
                    result.append([nums[i], nums[left], nums[right]])
                    while left < right and nums[left] == nums[left + 1]:
                        left += 1
                    while left < right and nums[right] == nums[right - 1]:
                        right -= 1
                    left += 1
                    right -= 1
                elif current_num < target:
                    left += 1
                else:
                    right -= 1
        return result

目录

  1. 哈希表
  2. 1. 两数之和
  3. 2. 字母异位词分组
  4. 3. 最长连续序列
  5. 双指针
  6. 1. 移动零
  7. 2. 盛水最多的容器
  8. 3. 三数之和
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Neo4j Desktop 2 安装配置与图数据库实战
  • Llama Factory 一键生成可部署 API 服务
  • Qwen-Image-2512:消费级 GPU 本地部署 AI 文生图方案
  • Cursor、Claude Code 与 Codex:三款 AI 编程工具深度对比
  • STL RB-tree 红黑树原理与插入操作实现详解
  • 2026 年值得关注的开源低代码与零代码平台推荐
  • ComfyUI 深度解析:高性能 AI 绘画工作流实践
  • Windows 系统下 Neo4j 图数据库与 JDK 安装配置指南
  • C++ 搜索引擎核心:基于正倒排索引的 Searcher 实现解析
  • AI 时代内存需求暴涨背后的能源隐私与绿色技术解析
  • 机器人 DH 参数模型与正运动学
  • Python steamapi 库:Steam 数据获取与五大应用场景
  • Spring Boot 分组校验、自定义注解与 Redis 登录验证实战
  • 基于 YOLOv8 系列的乡村道路路面缺陷智能检测与预警系统开发
  • 单点登录(SSO)架构设计与核心原理解析
  • OpenClaw 多 Agent 对接飞书机器人架构与配置
  • Web 环境模拟实战:用 C++ Addon 完美还原 document.all
  • 使用 AI 快速验证 GIT 环境配置方案
  • HarmonyOS 开发核心知识点汇总
  • 具身智能机器人协同调度与全模态 AI 模型架构解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online