【算法面试必刷】15. 三数之和

目录

题目

题目链接

思路

复杂度

1. 排序阶段

2. 双指针搜索阶段

3. 总时间复杂度

4. 空间复杂度

代码

题目

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

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

题目链接

15. 三数之和 - 力扣(LeetCode)https://leetcode.cn/problems/3sum/description/?envType=study-plan-v2&envId=top-100-liked

思路

核心思想排序 + 双指针

为什么需要排序?

  1. 有序数组才能使用双指针
  2. 方便去重
  3. 可以提前终止搜索

为什么用双指针?
将 O(n³) 的暴力搜索优化为 O(n²)

复杂度

1. 排序阶段

  • 使用快速排序或归并排序
  • 时间复杂度:O(n log n)

2. 双指针搜索阶段

外层循环:执行 n-2 次,O(n) 内层循环:双指针,最坏 O(n) 总计:O(n × n) = O(n²)

为什么是 O(n²)?

  • 固定 nums[i],在 [i+1, n-1] 区间用双指针找两个数
  • 双指针遍历区间长度平均为 n/2
  • 所以是:n × (n/2) ≈ O(n²)

3. 总时间复杂度

text

O(n log n) + O(n²) = O(n²)

因为 n² 的增长速度比 n log n 快,所以主导项是 O(n²)

4. 空间复杂度

排序:O(log n) 到 O(n)(取决于排序算法) 结果存储:O(k),k是结果数量 额外空间:O(1)(双指针只用常数空间) 总空间复杂度:O(n)(如果考虑结果存储) 如果不考虑结果存储:O(log n) 或 O(1)

代码

class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> ans; // 存储结果 int n = nums.size(); // 数组长度 // 1. 特殊情况处理:数组长度正好为3 if (n == 3) { int sum = nums[0] + nums[1] + nums[2]; if (sum == 0) { ans.push_back({nums[0], nums[1], nums[2]}); } return ans; // 直接返回,不需要复杂处理 } // 2. 关键步骤:排序(使双指针法可行) sort(nums.begin(), nums.end()); // 3. 遍历每个数字作为第一个数 for (int i = 0; i < n; i++) { // 3.1 去重:跳过重复的第一个数 // 因为排序后,相同的数字会相邻 if (i != 0 && nums[i - 1] == nums[i]) { continue; } // 3.2 双指针初始化 int l = i + 1; // 左指针,从i后面开始 int r = n - 1; // 右指针,从末尾开始 // 3.3 双指针查找剩余两个数 while (l < r) { int sum = nums[i] + nums[l] + nums[r]; if (sum > 0) { // 和太大,需要减小,右指针左移 r--; } else if (sum < 0) { // 和太小,需要增大,左指针右移 l++; } else { // 找到和为0的三元组 ans.push_back({nums[i], nums[l], nums[r]}); // 去重:跳过重复的左指针元素 while (l < r && nums[l] == nums[l + 1]) { l++; } // 去重:跳过重复的右指针元素 while (l < r && nums[r] == nums[r - 1]) { r--; } // 移动指针,继续查找其他可能 l++; r--; } } } return ans; } };

Read more

使用LLama.cpp本地部署大模型

摘要         llama.cpp是一个基于C/C++开发的高效大语言模型推理工具,支持跨平台部署和Docker快速启动,核心功能是在有限的计算资源情况下本地部署使用大模型。本文介绍了通过Docker方式部署llama.cpp的步骤,包括如何下载模型、CPU/GPU配置及启动参数说明。llama.cpp提供Web UI界面和OpenAI兼容API,支持文本和多模态对话,对电脑配置要求不高,完全免费且私密,让普通用户也能轻松在本地运行大语言模型。 LLama.cpp简介        1. llama.cpp 是一个在 C/C++ 中实现大型语言模型(LLM)推理的工具         2.支持跨平台部署,也支持使用 Docker 快速启动         3.可以运行多种量化模型,对电脑要求不高,CPU/GPU设备均可流畅运行。         支持模型包含:llama系列,qwen系列,gemma系列,Falcon、Alpaca、GPT4All、Chinese LLaMA、Vigogne、

By Ne0inhk

零基础指南:学生如何申请和使用GitHub Copilot

快速体验 1. 打开 InsCode(快马)平台 https://www.inscode.net 2. 输入框内输入如下内容: 创建一个面向编程新手的Jupyter Notebook教程,内容包含:1. GitHub Copilot学生认证申请步骤截图;2. 基础Python语法练习(变量、循环、函数);3. 使用Copilot完成简单计算器项目。要求每个步骤都有详细说明和Copilot使用技巧提示。 1. 点击'项目生成'按钮,等待项目生成完整后预览效果 零基础指南:学生如何申请和使用GitHub Copilot 作为一名计算机专业的学生,最近在同学的推荐下尝试了GitHub Copilot这个AI编程助手,发现它真的能大幅提升学习效率。今天就把我的完整使用经验整理出来,特别适合刚接触编程的新手参考。 一、GitHub学生认证申请 1. 首先需要注册GitHub账号,这个步骤很简单,在官网填写基本信息就能完成。记得使用学校邮箱注册,后续认证会更容易通过。

By Ne0inhk

小白也能懂:用Llama Factory轻松搭建大模型训练环境

小白也能懂:用Llama Factory轻松搭建大模型训练环境 作为一名刚接触大模型的新手,面对复杂的文档和配置要求时难免感到无从下手。本文将带你从零开始,通过Llama Factory这一开源工具快速搭建大模型微调环境,无需纠结依赖安装和环境配置,直接进入核心学习阶段。 这类任务通常需要GPU环境支持,目前ZEEKLOG算力平台提供了包含Llama Factory的预置镜像,可快速部署验证。但无论你选择哪种运行环境,本文的操作步骤都完全适用。 为什么选择Llama Factory? Llama Factory是一个专为大模型微调设计的开源框架,它的核心优势在于: * 开箱即用:预置了主流的微调算法(如LoRA、QLoRA等),无需从零实现 * 多模型支持:适配LLaMA、Qwen、ChatGLM等常见开源模型 * 可视化界面:提供Web UI降低学习曲线 * 资源友好:支持参数高效微调方法,降低显存需求 对于刚毕业的程序员来说,它能让你跳过繁琐的环境搭建,直接进入模型微调的实践环节。 环境准备:5分钟快速部署 使用预装环境可以避免90%的依赖问题。以下是两

By Ne0inhk
AIGC浪潮下,风靡全球的Mcp到底是什么?一文讲懂,技术小白都知道!!

AIGC浪潮下,风靡全球的Mcp到底是什么?一文讲懂,技术小白都知道!!

个人主页-爱因斯晨 文章专栏-AIGC   长大好多烦恼,好愁! 目录   前言 初步了解 Mcp到底是个啥? 发展 理论基础 核心组件 使用逻辑 于传统API不同之处 模型推荐   前言 上年这个时候,刚拿到录取通知书。哥哥教我用ai智能体,其实就是向我炫技。当时我问他,为什么不能直接给我生成图表,直接给我生成多好,省得我再去复制了。他说,其实很简单,只要做个接口协议什么的就行,只是目前国内没人做。当时说的很高深,我也听不懂。没想到年底,这个功能就实现内测了。在某种程度上,我也算是预言了哈哈。 初步了解 Mcp到底是个啥? Mcp,全称 Model Context Protocol,翻译过来是模型上下文协议。你不用管这高大上的名字,简单说,它就是和大 AI 模型聊天时,一种把相关信息整理好、按规矩传给 AI 的方式。

By Ne0inhk