LeetCode-hot100——双指针

什么情况下可以用双指针方法

1. 数据特征(必要条件)

  • 数据结构是有序的数组 / 字符串(最核心特征):左右指针的核心是 “通过指针移动调整值的大小 / 满足匹配条件”,有序性是指针移动有明确方向的前提;
  • 数据结构是线性的、可通过下标 / 索引访问两端(数组、字符串、双链表):左右指针需要从 “两端向中间” 移动,无法访问两端的结构(如单链表)不适合。

2. 问题目标(充分条件)

问题要求在数据中找「一对 / 一组元素」满足以下特征之一:

  • 数值类:两数 / 三数之和、目标差值、最接近目标值;
  • 匹配类:回文验证、对称判断、字符匹配;
  • 操作类:反转数组 / 字符串、移除指定元素(有序场景)、分区(如快速排序的 partition)。

不适用情况

1. 数据无序且无法排序

比如 “两数之和(无序数组)”:

  • 若题目要求返回原始下标,排序会打乱下标,此时无法用左右指针(只能用哈希表);
  • 核心原因:排序破坏了问题的约束条件,左右指针的有序前提消失。

2. 数据结构无法访问两端

比如 “单链表的回文验证”:

  • 单链表只能从头部遍历,无法直接访问尾部,无法初始化右指针;
  • 替代方案:先用快慢指针找中点,再反转后半段链表,再用双指针比较(但已不是纯左右指针)。

3. 问题目标是 “全局遍历” 而非 “两端匹配”

比如 “数组中找最长递增子序列”:

  • 问题目标是找递增序列,无 “两端向中间” 的匹配逻辑,左右指针无移动方向;
  • 核心原因:问题不依赖 “两端值的比较”,无法通过指针移动缩小问题范围。

移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12] 输出: [1,3,12,0,0]

示例 2:

输入: nums = [0] 输出: [0]

思路:

  • 让左右指针从起点开始,当右指针遇到非零数时,两个指针的值交换
  • 左指针的左边都是非零数
  • 右指针的左边至左指针都为零
class Solution: def moveZeroes(self, nums: List[int]) -> None: n = len(nums) left = right = 0 while right < n: if nums[right] != 0: nums[left], nums[right] = nums[right], nums[left] left += 1 right += 1 return nums 

盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:

输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1] 输出:1

思路:

  • 让左右指针从两端开始,"谁短谁移动"
  • 定义一个最大面积MAX_area,每移动一次就与当前面积比较,将较大面积的值存放在MAX_area中。

class Solution: def maxArea(self, height: List[int]) -> int: max_area = 0 left= 0 right= len(height) - 1 while left < right: width=right-left h=min(height[left],height[right]) area=h*width max_area=max(max_area,area) if height[left]>height[right]: right-=1 else: left+=1 return max_area 

三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]] 解释: nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。 nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。 nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。 不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。 注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1] 输出:[] 解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0] 输出:[[0,0,0]] 解释:唯一可能的三元组和为 0 。

思路:

  • 因为是三数相加,如果用暴力的方法会超出时间限制
  • 先给数组排序,让i从头开始,左指针从i后一位,右指针从右端开始遍历
  • 三数之和大于0,则让右指针移动;小于0,则让左指针移动
  • 注意:遍历前要确保不出现相同元素的三元组,所以需要判断前后元素是否一致,避免重复遍历。
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: result = [] nums.sort() for i in range(len(nums)): if nums[i]>0: break if i>0 and nums[i]==nums[i-1]: continue left=i+1 right=len(nums)-1 while left<right: current_num=nums[i]+nums[left]+nums[right] if current_num==0: result.append([nums[i],nums[left],nums[right]]) left += 1 right -= 1 while left<right and nums[left]==nums[left-1]: left+=1 while left < right and nums[right] == nums[right +1]: right-=1 elif current_num<0: left+=1 else: right-=1 return result 

Read more

llama.cpp量化模型部署实战:从模型转换到API服务

1. 为什么你需要关注llama.cpp:让大模型在普通电脑上跑起来 如果你对AI大模型感兴趣,肯定听说过动辄需要几十GB显存的“庞然大物”。想在自己的电脑上跑一个7B参数的模型,以前可能得配一张昂贵的专业显卡。但现在,情况不一样了。我今天要跟你聊的 llama.cpp,就是那个能让大模型“瘦身”并飞入寻常百姓家的神奇工具。 简单来说,llama.cpp是一个用C/C++编写的开源项目,它的核心目标只有一个:用最高效的方式,在消费级硬件(比如你的笔记本电脑CPU)上运行大型语言模型。它不像PyTorch那样是个庞大的深度学习框架,它更像一个“推理引擎”,专注于把训练好的模型,以最小的资源消耗跑起来。 我刚开始接触大模型部署时,也被各种复杂的依赖和巨大的资源需求劝退过。直到用了llama.cpp,我才发现,原来在我的MacBook Pro上,也能流畅地和Llama 2这样的模型对话。这背后的功臣,主要就是两点:纯C/C++实现带来的极致性能,以及模型量化技术带来的体积与速度革命。量化这个词听起来有点技术,你可以把它想象成给模型“压缩图片”

By Ne0inhk
超详细 | pycharm提交项目代码到GitHub的方法(图文)

超详细 | pycharm提交项目代码到GitHub的方法(图文)

在提交项目前,请先确保已经在电脑本机安装了,Git工具,如果没有安装,可以在官网 https://git-scm.com/下载安装,配置好path环境变量。 1、在pycharm加载项目,选择菜单的VCS选项→Create Git Repository... 2、选择项目所在目录,确定后,这个目录就会变成git项目了,而且代码的颜色会发生变化,一半是偏红色 3、右键git,然后选择Add提交项目到暂存区。提交完毕后,项目的文件颜色会变成绿色 4、继续右键项目,选择Commit Directory...提交项目更改。 随便写入代码说明,然后提交 5、在pycharm登录GitHub账号,选择Setting、版本控制,Github 6、选择通过口令登录微智启软件工作室原创文章 7、点击这个,打开设置界面,登录自己的账号 8、在弹出的浏览器中,勾选所有复选框,然后选择【Generate

By Ne0inhk

Venera开源漫画阅读器全攻略:从认知到优化的个性化漫画体验

Venera开源漫画阅读器全攻略:从认知到优化的个性化漫画体验 【免费下载链接】veneraA comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera 一、认知:快速了解Venera的核心价值 Venera是一款功能全面的开源漫画阅读器,专为漫画爱好者设计。它像一个数字漫画图书馆管理员,不仅能帮你整理本地漫画,还能连接网络资源,让你随时随地享受阅读乐趣。 1.1 3分钟了解核心功能矩阵 Venera主要由四大功能模块构成,共同打造完整的漫画阅读体验: 功能模块核心价值适用场景阅读界面提供沉浸式阅读体验日常漫画阅读资源管理统一管理本地与网络漫画个人漫画收藏整理搜索发现多平台资源聚合搜索寻找新漫画资源系统配置个性化应用设置优化阅读体验 1.2 5个必须知道的技术亮点 * 跨平台支持:一次安装,多设备使用,包括手机、平板和电脑 * 漫画源扩展:通过JavaScript脚本扩展漫画来源,如同给阅读器添加新的"图书供应商" * 智能缓存系统:自动管理图片缓存,平衡阅读流畅度和存储空间 * 自定义阅读模式:

By Ne0inhk
【Linux】从版本控制到代码调试:Git 入门与 GDB 调试器学习指南

【Linux】从版本控制到代码调试:Git 入门与 GDB 调试器学习指南

前言  作为 Linux 开发的 “左膀右臂”,Git 管版本、gdb 调程序 —— 前者搞定代码的迭代与协同,后者专治程序里的各种 “疑难杂症”。这篇博客就从 Git 的核心概念、基础操作,讲到 gdb 的调试指令,把这俩工具的高频用法讲透,帮你把开发效率直接拉满。 目录 一、Git 版本控制器 1.1 什么是 Git? 【问题】:什么是分布式? 【问题】:什么是集中式? 1.2 Git 核心概念  1.3 GitHub 与 Gitee 二、Git 基础操作 1. Git安装 2. 远程仓库与本地仓库联动(以

By Ne0inhk