977. 有序数组的平方

977. 有序数组的平方

题目:

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例:

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:

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

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 已按 非递减顺序 排序

进阶:

  • 请你设计时间复杂度为 O(n) 的算法解决本问题

解题:

方法一:直接排序

最简单的方法就是将数组 nums 中的数平方后直接排序。

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {vector<int> ans;for(int num : nums) {ans.push_back(num * num);}sort(ans.begin(),ans.end());return ans;}
};

复杂度分析

时间复杂度:O(nlog⁡n),其中 n 是数组 nums 的长度。

空间复杂度:O(log⁡n)。除了存储答案的数组以外,我们需要 O(log⁡n) 的栈空间进行排序。

方法二:双指针法

方法一没有利用「数组 nums 已经按照升序排序」这个条件。显然,如果数组 nums 中的所有数都是非负数,那么将每个数平方后,数组仍然保持升序;如果数组 nums 中的所有数都是负数,那么将每个数平方后,数组会保持降序。

这样一来,如果我们能够找到数组 nums 中负数与非负数的分界线,那么就可以用类似「归并排序」的方法了。具体地,我们设 neg 为数组 nums 中负数与非负数的分界线,也就是说,nums[0] 到 nums[neg] 均为负数,而 nums[neg+1] 到 nums[n−1] 均为非负数。当我们将数组 nums 中的数平方后,那么 nums[0] 到 nums[neg] 单调递减,nums[neg+1] 到 nums[n−1] 单调递增。

由于我们得到了两个已经有序的子数组,因此就可以使用归并的方法进行排序了。具体地,使用两个指针分别指向位置 neg 和 neg+1,每次比较两个指针对应的数,选择较小的那个放入答案并移动指针。当某一指针移至边界时,将另一指针还未遍历到的数依次放入答案。

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int n = nums.size();int negative = -1;for(int i = 0; i < n; ++i) {if(nums[i] < 0) {negative = i;} else {break;}}vector<int> ans;int i = negative, j = negative + 1;while(i >= 0 || j < n) {if(i < 0) { 			// 说明数组没有负数ans.push_back(nums[j]*nums[j]);++j;} else if (j == n) {    // 说明数组全是负数ans.push_back(nums[i]*nums[i]);--i;} else if(nums[i]*nums[i] < nums[j]*nums[j]) { // 数组有正有负,比较两边ans.push_back(nums[i]*nums[i]);--i;} else {ans.push_back(nums[j]*nums[j]);++j;}}return ans;}
};

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。

  • 空间复杂度:O(1)。除了存储答案的数组以外,我们只需要维护常量空间。

方法三:双指针

同样地,我们可以使用两个指针分别指向位置 0 和 n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针。这种方法无需处理某一指针移动至边界的情况,读者可以仔细思考其精髓所在。

因此,对于前半部分负数而言,从前往后遍历,平方后相当于逆序(从大到小),对于后半部分正数而言,从后往前遍历,也相当于逆序(从大到小),因此,可以看成两个逆序数组数组从大到小排序,然后取较大者插入到答案数组尾部中。

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int n = nums.size();vector<int> ans(n);for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {if (nums[i] * nums[i] > nums[j] * nums[j]) {ans[pos] = nums[i] * nums[i];++i;}else {ans[pos] = nums[j] * nums[j];--j;}--pos;}return ans;}
};

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。

  • 空间复杂度:O(1)。除了存储答案的数组以外,我们只需要维护常量空间。

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

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

相关文章

vue2入门

vue2官方文档&#xff1a;安装 — Vue.js 1、安装 新建"vue"文件夹——>新建vue1.html 直接用<script>标签引入vue&#xff1a; <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> tips: CDN:一个网络…

Postman介绍和快速使用

Postman 是什么&#xff1f; Postman 是一个流行的API&#xff08;Application Programming Interface&#xff09;开发工具&#xff0c;它使得开发者可以很容易地创建、测试、共享和文档化API。Postman 提供了一个友好的用户界面&#xff0c;来发送HTTP请求&#xff0c;接收响…

【PHP】一个邮箱点击验证的完整示例

目录 1.效果展示 2.发送验证码 3.进行验证 以绑定邮箱为例&#xff0c;注册验证的话修改判断逻辑 1.效果展示 2.发送验证码 /*** 发点击验证* 参数 email*/public function sendClick(){$param $this->request->post();// 邮箱email的validate规则验证&#xff0c;略…

基于云主机的k8s环境搭建

1. 申请三台云主机(按量付费即可) 内网IP配置节点角色172.17.0.92C4Gk8s-master172.17.0.82C2Gk8s-node1172.17.0.172C2Gk8s-node2 2. 安装Kubernetes集群(全部节点执行以下操作) 关闭防火墙 systemctl stop firewalld systemctl disable firewalld关闭selinux sed -i s/e…

非常好用的C++跨平台网络通信Mongoose,随笔记录

简介 Mongoose 是一个 C/C 网络库。它实现了事件驱动&#xff0c; TCP、UDP、HTTP、WebSocket、MQTT 的非阻塞 API。它连接设备 并将它们带到网上。自 2004 年以来&#xff0c;一些开源和商业 产品已经利用了它。它甚至运行在 国际空间站&#xff01; Mongoose 使嵌入式网络编…

vscode配置latex环境

vscode配置latex环境 1.安装LaTeX Workshop插件2.配置环境附录 1.安装LaTeX Workshop插件 2.配置环境 按照下图进行操作&#xff1a; 在打开的settings.json中加入如下代码&#xff08; 每行代码的含义见代码详解 &#xff09;&#xff1a; "latex-workshop.latex.autoB…

java中实现定时给微信群中发送每日简报

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff0c;雄雄的小课堂。 首先给大家看一下实现的效果&#xff1a; 我这边是定时一早6点多发。 下面是代码&#xff1a; /*** (微信机器人)每天早上6点将国内新闻发送至群中*/GetMapping("/sendNewsPengPa…

pytest_collection_modifyitem对用例进行过滤

pytest_collection_modifyitem在收集完用例后执行&#xff0c;通过此hooks&#xff0c;在conftest.py中可以实现对用例的过滤和重新排序 根据用例标记和执行参数标记用例是否跳过( --headless运行时&#xff0c;并且标记only_headed的用例跳过&#xff09; def pytest_collec…

uniapp中uni-data-select下拉框组件如何去除边框?

在目录中找到文件夹。 找到下拉框组件文件夹 注释该文件夹以下代码就能实现下拉框不带边框。

Kubernetes (k8s) 快速认知

应用部署方式 传统部署时代 早期的时候&#xff0c;各个组织是在物理服务器上运行应用程序。缺点 资源分配问题&#xff1a; 无法限制在物理服务器中运行的应用程序资源使用 维护成本问题&#xff1a; 部署多个物理机&#xff0c;维护许多物理服务器的成本很高 虚拟化部署时…

vue中如何做单元测试 ,请举例说明

vue中如何做单元测试10. 测试 TestVue Test Utils Vue Test Utils 使用实例 vue-jest 使用 vue-jest 进行 Vue 3 单元测试示例 vue中如何做单元测试 在 Vue 中进行单元测试可以使用 Jest 这样的测试框架&#xff0c;它可以提供丰富的 API 和插件来方便地编写、运行和报告测试…

【QT】QListWidget控件的使用

目录 1.概述 2.QListWidget 类常用的属性和方法 3.QListWidget列表框的信号和槽 4.QListWidget 类常用操作示例 4.1 初始化列表 4.2 插入项 4.3 删除当前项和清空列表 4.4 遍历并选择项 4.5 QListWidgetItem常用信号 5.QListWidget 类简单应用 1.概述 Qt 中用于项 (Item &#…

ctrl+d删除的东西怎么没有在回收站?分享原因及解决方法

“好奇怪哦&#xff0c;我用公司电脑的时候&#xff0c;使用ctrld误删除了一个XLSX格式的文件&#xff0c;回收站里也没有找到怎么回事&#xff1f;请问这样删除的文件能恢复吗&#xff1f;求各位高手指点。感谢&#xff5e;” ——在电脑操作中&#xff0c;CtrlD组合键被广泛应…

微信小程序实现上拉加载分页列表的性能优化

微信小程序实现上拉加载分页列表的性能优化 我们的功能里面有个滚动到底部加载的功能&#xff0c;优化前我们的做法是这样的&#xff1a; 大部分人面对长列表滚动的时候&#xff0c;一开始的处理方式都是这样的&#xff0c;如果数据不多&#xff0c;只有几页可能不会太暴露问题…

Java中23种设计模式

提示&#xff1a;文中有理解不到位的地方&#xff0c;欢迎各位大佬指点批评 文章目录 前言创建型模式&#xff08;关注对象的创建过程&#xff09;&#xff1a;工厂方法模式&#xff08;Factory Method&#xff09;抽象工厂模式&#xff08;Abstract Factory&#xff09;建造者…

安全生产隐患排查治理信息化系统软件

安全隐患排查系统实现对重大危险源企业、安全隐患信息的登记、整改、复查、分类和统计。系统涵盖了安全隐患排查整治工作的各项基本内容&#xff0c;实现以安全隐患排查整治业务流为主线&#xff0c;处理流程简洁清晰、快速灵活&#xff1b;以排查整治流程为干线&#xff0c;快…

PyQt6 QToolBar工具栏控件

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计44条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

进程通信知识基础【Linux】——下篇

目录 前文 一&#xff0c;命名管道 创建命名管道 1. getline——c库 2. unlink——系统接口 实践代码 common.hpp client.cpp server.cpp Log.cpp 二&#xff0c;共享内存&#xff08;system V接口&#xff09; 1. 创建共享内存 shmget接口 2. 删除共享内存 常见…

Mybatis-plus 跳过全局变量的设置 ignoreQueryFilters

Mybatis-plus 跳过全局变量的设置 忽略全局的查询过滤器QueryUpdate 忽略全局的查询过滤器 在Mybatis-plus中&#xff0c;如果你想在执行某些操作时跳过逻辑删除规则&#xff0c;你可以使用wrapper查询包装器的ignoreQueryFilters方法。这个方法可以让你在执行查询或更新操作时…

推荐使用过很好用的api,含免费次数

IP归属地-IPv4城市级&#xff1a;根据IP地址查询归属地信息&#xff0c;支持到城市级&#xff0c;包含国家、省、市、和运营商等信息。IP归属地-IPv6城市级&#xff1a;根据IP地址&#xff08;IPv6版本&#xff09;查询归属地信息&#xff0c;支持到中国大陆地区&#xff08;不…