LeetCode 977 题:有序数组的平方

LeetCode 977 题:有序数组的平方 (Squares of a Sorted Array)

LeetCode 第977题要求给定一个按非降序排列的整数数组 nums,返回每个数字的平方并按升序排列。


题目描述

给定一个整数数组 nums,它按非降序排列(即 nums[i] <= nums[i+1]),请返回该数组中每个数字的平方并按升序排列。

示例 1

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]

示例 2

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

解题思路

  1. 双指针法

    • 因为输入数组已经按非降序排列,所以数组中的元素的平方值并不会有严格的顺序。
    • 数组的平方值可能有两个不同的极端值:
      • 负数的平方会变大,可能会出现在数组的左侧。
      • 正数的平方会变小,可能会出现在数组的右侧。
  2. 双指针

    • 我们可以使用两个指针,一个从数组的左端开始,另一个从右端开始。比较这两个指针指向的元素的平方值,较大的平方值将放在结果数组的末尾。
    • 将结果数组的指针逐渐向中间靠拢,直到所有的平方值都被放入结果数组。
  3. 复杂度分析

    • 时间复杂度 O ( n ) O(n) O(n),其中 n n n 是数组 nums 的长度。我们只遍历数组一次。
    • 空间复杂度 O ( n ) O(n) O(n),我们使用额外的数组存储结果。

C语言代码实现

以下是使用双指针法的代码实现:

#include <stdio.h>
#include <stdlib.h>int* sortedSquares(int* nums, int numsSize, int* returnSize) {int left = 0, right = numsSize - 1;*returnSize = numsSize;int* result = (int*)malloc(sizeof(int) * numsSize);int index = numsSize - 1; // 结果数组的指针从末尾开始while (left <= right) {if (abs(nums[left]) > abs(nums[right])) {result[index--] = nums[left] * nums[left];left++;} else {result[index--] = nums[right] * nums[right];right--;}}return result;
}int main() {int nums[] = {-4, -1, 0, 3, 10};int returnSize;int* result = sortedSquares(nums, 5, &returnSize);printf("Result: ");for (int i = 0; i < returnSize; i++) {printf("%d ", result[i]);}printf("\n");free(result); // 释放内存return 0;
}

逐行解释代码

函数 sortedSquares
int left = 0, right = numsSize - 1;
*returnSize = numsSize;
int* result = (int*)malloc(sizeof(int) * numsSize);
  • 初始化左右指针 leftright,分别指向数组的起始和末尾。
  • returnSize 保存结果数组的大小,即 numsSize
  • 使用 malloc 动态分配内存给结果数组 result,其大小为输入数组 nums 的长度。

int index = numsSize - 1; // 结果数组的指针从末尾开始
  • index 指针从结果数组的末尾开始,这样可以确保我们从最大值开始填充数组。

while (left <= right) {if (abs(nums[left]) > abs(nums[right])) {result[index--] = nums[left] * nums[left];left++;} else {result[index--] = nums[right] * nums[right];right--;}
}
  • 使用 while 循环,直到 leftright 指针交汇。
  • 比较 nums[left]nums[right] 的绝对值:
    • 如果 nums[left] 的绝对值大于 nums[right],则将 nums[left] 的平方放入 result 数组的末尾,并将 left 指针向右移动。
    • 否则,将 nums[right] 的平方放入 result 数组的末尾,并将 right 指针向左移动。
  • 每次操作后,index 指针向前移动,以确保将平方值存入正确的位置。

return result;
  • 返回结果数组 result,它包含按升序排列的平方值。

测试代码 main
int nums[] = {-4, -1, 0, 3, 10};
int returnSize;
int* result = sortedSquares(nums, 5, &returnSize);printf("Result: ");
for (int i = 0; i < returnSize; i++) {printf("%d ", result[i]);
}
printf("\n");free(result); // 释放内存
  • 定义一个测试用例 nums = {-4, -1, 0, 3, 10}
  • 调用 sortedSquares 函数获取结果。
  • 打印输出结果数组。
  • 使用 free 释放 malloc 动态分配的内存。

测试结果

运行代码后输出:

Result: 0 1 9 16 100

复杂度分析

  1. 时间复杂度 O ( n ) O(n) O(n)

    • 我们只遍历一次数组,leftright 每次向内移动一次,最终会遍历整个数组。
  2. 空间复杂度 O ( n ) O(n) O(n)

    • 我们使用了一个额外的数组 result 来存储平方后的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/65924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

excel仅复制可见单元格,仅复制筛选后内容

背景 我们经常需要将内容分给不同的人&#xff0c;做完后需要合并 遇到情况如下 那是因为直接选择了整列&#xff0c;当然不可以了。 下面提供几种方法&#xff0c;应该都可以 直接选中要复制区域然后复制&#xff0c;不要选中最上面的列alt;选中可见单元格正常复制&#xff…

支持向量回归(SVR:Support Vector Regression)用于A股数据分析、预测

简单说明 支持向量回归是一种用来做预测的数学方法,属于「机器学习」的一种。 它的目标是找到一条「最合适的线」,能够大致描述数据点的趋势,并允许数据点离这条线有一定的误差(不要求所有点都完全落在这条线上)。 可以把它想象成:找到一条「宽带」或「隧道」,大部分…

LabVIEW水位监控系统

LabVIEW开发智能水位监控系统通过集成先进的传感技术与控制算法&#xff0c;为工业液体存储提供精确的水位调控&#xff0c;保证了生产过程的连续性与安全性。 项目背景 在化工和饮料生产等行业中&#xff0c;水位控制的准确性对保证生产安全和提高产品质量至关重要。传统的水…

深入浅出 Android AES 加密解密:从理论到实战

深入浅出 Android AES 加密解密&#xff1a;从理论到实战 在现代移动应用中&#xff0c;数据安全是不可忽视的一环。无论是用户隐私保护&#xff0c;还是敏感信息的存储与传输&#xff0c;加密技术都扮演着重要角色。本文将以 AES&#xff08;Advanced Encryption Standard&am…

React Fiber框架中的Render渲染阶段——workLoop(performUnitOfWork【beginWork与completeWork】)

触发渲染过程——renderRoot renderRoot 是一个函数&#xff0c;用于触发渲染工作。它通常会调用并递归地执行一系列的渲染任务&#xff0c;直到完成整个更新过程。这个过程包括执行 Fiber 树中的 beginWork 和 completeWork&#xff0c;以及渲染新状态或 DOM。 function ren…

【优先算法】思还故里闾,欲归道无因 - 前缀和

本篇博客给大家带来的是前缀和算法的知识点, 也是一样通过OJ题理解,掌握,应用该算法. &#x1f40e;文章专栏: 算法 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&…

亿道三防丨三防笔记本是什么意思?和普通笔记本的优势在哪里?

三防笔记本是什么意思&#xff1f;和普通笔记本的优势在哪里&#xff1f; 在现代社会中&#xff0c;笔记本电脑已经成为人们工作和生活中不可或缺的一部分。然而&#xff0c;在一些特殊行业或环境中&#xff0c;普通笔记本电脑由于其脆弱性和对环境条件的敏感性&#xff0c;往…

SOME/IP 协议详解——服务发现

文章目录 1. Introduction &#xff08;引言&#xff09;2. SOME/IP Service Discovery (SOME/IP-SD)2.1 General&#xff08;概述)2.2 SOME/IP-SD Message Format2.2.1 通用要求2.2.2 SOME/IP-SD Header2.2.3 Entry Format2.2.4 Options Format2.2.4.1 配置选项&#xff08;Co…

Go语言之路————go环境的初始化

Go语言之路————go环境的初始化 前言一、Go的安装二、环境配置三、初始化一个新项目四、常用的一些指令 前言 我是一名多年Java开发人员&#xff0c;因为工作需要现在要学习go语言&#xff0c;Go语言之路是一个系列&#xff0c;记录着我从0开始接触Go&#xff0c;到后面能正…

鸿蒙UI开发——基于onTouch事件实现表情选择胶囊

1、背 景 有朋友留言说&#xff0c;抖音APP中&#xff0c;长按评论按钮触发的快捷表情选择胶囊动画比较好&#xff08;效果如下图&#xff09;&#xff0c;希望使用鸿蒙ArkTs也实现一个类似的。 本文在鸿蒙ArkTs下也实现一个类似的效果&#xff0c;如下&#xff1a; 首先&…

Node.js——http 模块(二)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

研华 PCI-1751 驱动更新导LabVIEW致程序异常

问题描述&#xff1a; 某 LabVIEW 程序长期运行正常&#xff0c;但在使用研华 PCI-1751 数据采集卡运行一段时间后&#xff0c;程序开始出现不正常的行为。具体过程如下&#xff1a; 初始问题&#xff1a; 更换新的 PCI-1751 板卡后&#xff0c;驱动程序被更新&#xff0c;但程…

接上篇基于Alertmanager 配置钉钉告警

Alertmanager 是一个用于处理和管理 Prometheus 警报的开源工具。它负责接收来自 Prometheus 服务器的警报&#xff0c;进行去重、分组、静默、抑制等操作&#xff0c;并通过电子邮件、PagerDuty、Slack 等多种渠道发送通知。 主要功能 去重&#xff1a;合并相同或相似的警报&…

网络原理(三)—— 传输层 之 UDP 和 TCP协议

传输层 在传输层两大关键的协议就是UDP和TCP协议了&#xff0c;除此之外&#xff0c;还有别的传输层协议&#xff0c;本文章将介绍UDP和TCP协议&#xff0c;重点介绍TCP协议。 首先回顾TCP和UDP 的特点&#xff1a; UDP&#xff1a;不可靠传输&#xff0c;面向数据包&#xf…

针对服务器磁盘爆满,MySql数据库始终无法启动,怎么解决

&#xff08;点击即可进入聊天助手&#xff09; 很多站长在运营网站的过程当中都会遇到一个问题,就是网站突然无法打开,数据一直无法启动 无论是强制重启还是,删除网站内的所有应用,数据库一直无法启动 这个时候,就需要常见的运维手段了,需要对服务器后台各个资源,进行逐一排查…

高性能现代PHP全栈框架 Spiral

概述 Spiral Framework 诞生于现实世界的软件开发项目是一个现代 PHP 框架&#xff0c;旨在为更快、更清洁、更卓越的软件开发提供动力。 特性 高性能 由于其设计以及复杂精密的应用服务器&#xff0c;Spiral Framework框架在不影响代码质量以及与常用库的兼容性的情况下&a…

【STM32-学习笔记-6-】DMA

文章目录 DMAⅠ、DMA框图Ⅱ、DMA基本结构Ⅲ、不同外设的DMA请求Ⅳ、DMA函数Ⅴ、DMA_InitTypeDef结构体参数①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…

SQL Server中可以通过扩展事件来自动抓取阻塞

在SQL Server中可以通过扩展事件来自动抓取阻塞&#xff0c;以下是详细流程&#xff1a; 开启阻塞跟踪配置&#xff1a; • 执行以下SQL语句来启用相关配置&#xff1a; EXEC sp_configureshow advanced options, 1; RECONFIGURE; EXEC sp_configure blocked process thresh…

【爬虫】单个网站链接爬取文献数据:标题、摘要、作者等信息

源码链接&#xff1a; https://github.com/Niceeggplant/Single—Site-Crawler.git 一、项目概述 从指定网页中提取文章关键信息的工具。通过输入文章的 URL&#xff0c;程序将自动抓取网页内容 二、技术选型与原理 requests 库&#xff1a;这是 Python 中用于发送 HTTP 请求…

关于扫描模型 拓扑 和 传递贴图工作流笔记

关于MAYA拓扑和传递贴图的操作笔记 一、拓扑低模: 1、拓扑工作区位置: 1、准备出 目标 高模。 (高模的状态如上 ↑ )。 2、打开顶点吸附,和建模工具区,选择四边形绘制. 2、拓扑快捷键使…