news 2026/8/16 10:48:41

双指针专题(二):两头堵的智慧——「有序数组的平方」

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
双指针专题(二):两头堵的智慧——「有序数组的平方」

哈喽各位,我是前端小L。

场景想象:

给你一个已经排好序的数组 [-4, -1, 0, 3, 10]。

我们要把每个数平方,然后组成一个新的有序数组。

  • 直觉做法:先把每个数平方[16, 1, 0, 9, 100],然后调用sort()排序。

  • 问题sort()的复杂度是 $O(N \log N)$。面试官通常会问:“能不能用 $O(N)$ 解决?”

思考:

数组其实已经“部分”有序了。

  • 负数部分:越往左,绝对值越大,平方后越大。

  • 正数部分:越往右,绝对值越大,平方后越大。

    也就是说,最大的平方数,一定是在数组的最左边或者最右边! 不可能在中间。

力扣 977. 有序数组的平方

https://leetcode.cn/problems/squares-of-a-sorted-array/

题目分析:

  • 输入:按非递减顺序排序的数组nums(包含负数)。

  • 输出:每个数字的平方组成的新数组,也要按非递减顺序排序。

例子:[-4, -1, 0, 3, 10]

  • 左边-4平方是16

  • 右边10平方是100

  • 100 > 16,所以100肯定是新数组里的老大(最后一名)。

核心思维:左右夹逼 + 逆序填充

既然最大的数一定在两头,那我们就派出两个指针:

  1. 左指针 (left):指向开头(处理负数)。

  2. 右指针 (right):指向结尾(处理正数)。

  3. 结果指针 (k):指向新数组的最后一个位置(因为我们要先找最大的,填到最后去)。

操作逻辑:

  1. 比较nums[left]的平方和nums[right]的平方。

  2. 谁大选谁

    • 如果左边大:把左边的平方填入结果数组的k位置,left移。

    • 如果右边大:把右边的平方填入结果数组的k位置,right移。

  3. k指针向前移动一格,准备填倒数第二大的数。

  4. left > right时,结束。

代码实现 (JavaScript)

JavaScript

/** * @param {number[]} nums * @return {number[]} */ var sortedSquares = function(nums) { let n = nums.length; // 创建一个等长的新数组,用来存放结果 let result = new Array(n); let left = 0; let right = n - 1; // k 指向结果数组的最后一个位置(倒着填) let k = n - 1; // 注意:这里是 left <= right // 因为最后当 left === right 时,剩下的那个元素也要处理(平方后填入) while (left <= right) { let leftSquare = nums[left] * nums[left]; let rightSquare = nums[right] * nums[right]; if (leftSquare > rightSquare) { // 左边的平方更大,填入末尾 result[k] = leftSquare; left++; // 左指针向内收缩 } else { // 右边的平方更大(或相等),填入末尾 result[k] = rightSquare; right--; // 右指针向内收缩 } // 填完一个,k 往前挪一位 k--; } return result; };

深度模拟

输入:[-4, -1, 0, 3, 10]

  1. 初始L=0(-4),R=4(10),k=4

    • 比较:(-4)²=16vs10²=100

    • 选右边。res[4] = 100R变成 3。k变成 3。

    • 状态:[-4, -1, 0, 3],res=[?, ?, ?, ?, 100]

  2. 第二轮L=0(-4),R=3(3)。

    • 比较:16vs9

    • 选左边。res[3] = 16L变成 1。k变成 2。

    • 状态:[-1, 0, 3],res=[?, ?, ?, 16, 100]

  3. 第三轮L=1(-1),R=3(3)。

    • 比较:1vs9

    • 选右边。res[2] = 9R变成 2。k变成 1。

  4. ...以此类推,直到填满。

总结

这道题展示了双指针处理有序数组的强大能力。

  • 只要看到“有序数组”或者“数组部分有序”,且要求找“最大/最小/目标和”,第一反应就应该是左右指针

  • 关键技巧:“从两头往中间找,从后往前填结果”


下一题预告:三数之和

接下来我们要进入双指针专题的深水区了—— LC 15. 三数之和 (Medium)。

这是大厂面试中出现频率最高的算法题之一(绝对的 Top 5)。

  • 题目:给你一个数组,判断是否存在三个数a, b, c使得a + b + c = 0?找出所有不重复的三元组。

  • 难点:

    1. 怎么把三数之和降维?(还是用双指针)。

    2. 怎么去重?(比如数组里有三个-1,怎么保证不输出重复的结果?这是最容易写出 Bug 的地方)。

准备好迎接这道必考题了吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/9 18:39:57

双指针专题(三):去重的艺术——「三数之和」

哈喽各位&#xff0c;我是前端小L。 场景想象&#xff1a; 给你一个数组 [-1, 0, 1, 2, -1, -4]。 我们要找出所有和为 0 的三个数 [a, b, c]。 我们可以找到 [-1, 0, 1]。 还可以找到 [-1, 2, -1]&#xff08;排序后是 [-1, -1, 2]&#xff09;。 难点&#xff1a;数组里…

作者头像 李华
网站建设 2026/8/13 23:20:31

PyCharm远程调试大模型?IDE集成AI开发新玩法

PyCharm远程调试大模型&#xff1f;IDE集成AI开发新玩法 在当今的大模型开发浪潮中&#xff0c;越来越多的团队面临一个共同的困境&#xff1a;训练脚本跑在远程GPU集群上&#xff0c;日志输出有限&#xff0c;一旦出错只能靠“打印-重试”循环来排查问题。开发者像是在黑暗中调…

作者头像 李华
网站建设 2026/7/31 7:22:17

LLaMAPro结构修改微调:针对特定领域深度优化方案

LLaMAPro结构修改微调&#xff1a;针对特定领域深度优化方案 在医疗报告自动生成、金融研报精准解读等专业场景中&#xff0c;通用大语言模型的表现常常差强人意。即便经过传统LoRA微调&#xff0c;它们仍难以稳定输出符合行业规范的术语和逻辑链条。问题的根源或许不在参数本身…

作者头像 李华
网站建设 2026/7/31 7:22:22

人类对齐数据构建:如何采集高质量偏好样本?

人类对齐数据构建&#xff1a;如何采集高质量偏好样本&#xff1f; 在大模型能力飞速跃迁的今天&#xff0c;一个问题日益凸显&#xff1a;我们训练出的模型越来越“聪明”&#xff0c;但它们真的“听话”吗&#xff1f;一个能流畅写诗、编程、辩论的语言模型&#xff0c;如果输…

作者头像 李华
网站建设 2026/8/11 20:01:52

lut调色包下载站点整合?视觉生成模型色彩校准新方向

lut调色包下载站点整合&#xff1f;视觉生成模型色彩校准新方向 在AIGC内容爆发的今天&#xff0c;我们早已习惯了“输入一段文字&#xff0c;立刻生成一张图片”的魔法。但当你把这张图放进视频剪辑软件、准备发布时&#xff0c;却总感觉哪里不对劲——色彩太灰&#xff1f;肤…

作者头像 李华
网站建设 2026/7/31 7:22:23

java计算机毕业设计学生德育奖惩管理系统 高校毕业设计:基于SpringBoot的学生综合素质测评与奖助管理系统 本科项目实战:Web端德育量化考核及奖助学金发放平台

计算机毕业设计学生德育奖惩管理系统nc36c9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。德育分、奖学金、宿舍星级、违纪处分……传统纸质Excel 的登记方式让辅导员“表哥”“…

作者头像 李华