当前位置: 首页 > web >正文

977.有序数组的平方

版本一)双指针法
class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:l, r, i = 0, len(nums)-1, len(nums)-1res = [float('inf')] * len(nums) # 需要提前定义列表,存放结果while l <= r:if nums[l] ** 2 < nums[r] ** 2: # 左右边界进行对比,找出最大值res[i] = nums[r] ** 2r -= 1 # 右指针往左移动else:res[i] = nums[l] ** 2l += 1 # 左指针往右移动i -= 1 # 存放结果的指针需要往前平移一位return res

代码解释:有序数组的平方(Squares of a Sorted Array)

这段代码用于将一个 非递减排序的整数数组 nums(可能包含负数)中的每个元素平方后,返回一个新的 非递减排序的数组关键点

  • 利用原数组已排序的特性:最大的平方值一定出现在数组的两端(最左或最右)。
  • 双指针法:从数组两端向中间遍历,比较平方值,将较大的放入结果数组的末尾。

变量说明

变量作用初始值
l左指针(从数组头部开始)0
r右指针(从数组尾部开始)len(nums) - 1
i结果数组的填充位置(从末尾开始)len(nums) - 1
res存储结果的数组[float('inf')] * len(nums)

算法流程

  1. 初始化

    • 左指针 l = 0,右指针 r = len(nums) - 1
    • 结果数组 res 初始化为长度与 nums 相同的数组,填充 float('inf')(表示正无穷,仅占位用)。
  2. 循环条件while l <= r(左右指针未相遇时继续)。

  3. 比较平方值

    • 如果 nums[l]² < nums[r]²
      • 将 nums[r]² 存入 res[i]
      • 右指针左移(r -= 1)。
    • 否则:
      • 将 nums[l]² 存入 res[i]
      • 左指针右移(l += 1)。
    • 结果数组的填充位置 i 左移(i -= 1)。
  4. 返回结果res 即为平方后的有序数组。

具体例子

示例 1:nums = [-4, -1, 0, 3, 10]

执行过程

  1. 初始状态

    • nums = [-4, -1, 0, 3, 10]
    • l = 0r = 4i = 4
    • res = [inf, inf, inf, inf, inf]
  2. 第 1 轮循环

    • nums[0]² = 16nums[4]² = 100
    • 16 < 100 → res[4] = 100r = 3i = 3
    • res = [inf, inf, inf, inf, 100]
  3. 第 2 轮循环

    • nums[0]² = 16nums[3]² = 9
    • 16 > 9 → res[3] = 16l = 1i = 2
    • res = [inf, inf, inf, 16, 100]
  4. 第 3 轮循环

    • nums[1]² = 1nums[3]² = 9
    • 1 < 9 → res[2] = 9r = 2i = 1
    • res = [inf, inf, 9, 16, 100]
  5. 第 4 轮循环

    • nums[1]² = 1nums[2]² = 0
    • 1 > 0 → res[1] = 1l = 2i = 0
    • res = [inf, 1, 9, 16, 100]
  6. 第 5 轮循环

    • nums[2]² = 0nums[2]² = 0
    • 0 == 0 → res[0] = 0l = 3i = -1
    • res = [0, 1, 9, 16, 100]
  7. 循环结束l > r):

    • 最终 res = [0, 1, 9, 16, 100]

结果

  • 平方后的有序数组:[0, 1, 9, 16, 100]
示例 2:nums = [-7, -3, 2, 3, 11]

执行过程

  1. 初始状态

    • nums = [-7, -3, 2, 3, 11]
    • l = 0r = 4i = 4
    • res = [inf, inf, inf, inf, inf]
  2. 循环过程

    • fast=0nums[0]²=49nums[4]²=121 → res[4]=121r=3i=3
    • fast=1nums[0]²=49nums[3]²=9 → res[3]=49l=1i=2
    • fast=2nums[1]²=9nums[3]²=9 → res[2]=9r=2i=1
    • fast=3nums[1]²=9nums[2]²=4 → res[1]=9l=2i=0
    • fast=4nums[2]²=4nums[2]²=4 → res[0]=4l=3i=-1
  3. 结果

    • res = [4, 9, 9, 49, 121]

为什么用 float('inf') 初始化 res

  • 仅占位作用:表示未填充的位置,实际会被覆盖。
  • 可替换为其他值:例如 0 或 None,不影响逻辑。
http://www.xdnf.cn/news/4786.html

相关文章:

  • Kuikly 安装环境篇
  • ESP32-CAM开发板学习(一)
  • Windows环境,Python实现对本机处于监听状态的端口,打印出端口,进程ID,程序名称
  • 静态BFD配置
  • USB集线器芯片革新之战:CH334U如何以工业级性能重新定义HUB控制器
  • Python教程112:找到每月的第三个星期五(calendar)
  • 图表制作-带背景色的柱状图
  • C# NX二次开发:判断两个体是否干涉和获取系统日志的UFUN函数
  • 手撕基于AMQP协议的简易消息队列-3(项目所用到的工具类的编写)
  • DRF+Vue项目线上部署:腾讯云+Centos7.6
  • Android学习总结之kotlin协程面试篇
  • [学习]RTKLib详解:ephemeris.c与rinex.c
  • 77.组合问题
  • 基于Partial Cross Entropy的弱监督语义分割实战指南
  • ElasticSearch基本概念
  • Abaqus学习笔记
  • 解锁 LLM 推理速度:深入 FlashAttention 与 PagedAttention 的原理与实践
  • 如何对 Oracle 日志文件进行校验
  • AUBO STUDIO简介
  • Milvus(17):向量索引、FLAT、IVF_FLAT
  • 在现代Web应用中集成 PDF.js (pdfjs-dist 5.2 ESM): 通过 jsdelivr 实现动态加载与批注功能的思考
  • TDengine 在新能源行业应用
  • Java 线程全面概述
  • 在Excel图表添加辅助线
  • 在 YAFFS2 文件系统中,`yaffs_pread` 函数详解
  • 2.3 点云数据存储格式——LiDAR专用型点云存储格式
  • 003.chromium编译进阶-禁用css动画和禁用canvas渲染
  • 【最新版】likeshop连锁点餐系统-PHP版+uniapp前端全开源
  • 【LangChain基础系列】深入全面掌握文本分类
  • pyorch中tensor的理解与操作(一)