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

【代码随想录】有序数组的平方

本博文为《代码随想录》的学习笔记,原文链接:代码随想录

题目

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) 的算法解决本问题

题解

为适应机试环境,首先在Dev C++中编写程序

输入输出说明:

输入:数组元素个数n,数组nums元素

输出:平方并排序后数组

示例一:

输入:5 -4 -1 0 3 10
输出:0 1 9 16 100

示例二:

输入:5 -7 -3 2 3 11
输出:4 9 9 49 121

方法一:暴力求解

使用sort()函数对平方后的数组元素进行排序。

在Dev C++中编译

#include <bits/stdc++.h>
using namespace std;vector<int> sortedSquares(vector<int>& nums)
{int length=nums.size();vector<int> square;for(int i=0;i<length;i++){int ans=nums[i]*nums[i];square.push_back(ans);}sort(square.begin(), square.end());return square;
}
int main()
{int n;	cin>>n;vector<int>nums;for(int i=0;i<n;i++){int ans;cin>>ans;nums.push_back(ans);}vector<int> nums2 = sortedSquares(nums); // 调用你的实现for(int i=0;i<nums2.size();i++){cout<<nums2[i]<<" ";}return 0;
}

运行结果:

在LeetCode中运行

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int length = nums.size();vector<int> square;for (int i = 0; i < length; i++) {int ans = nums[i] * nums[i];square.push_back(ans);}sort(square.begin(), square.end());return square;}
};

这个时间复杂度是 O(n + nlogn), 可以说是O(nlogn)的时间复杂度,但为了和下面双指针法算法时间复杂度有鲜明对比,我记为 O(n + nlog n)。

方法二:双指针法

题目关键词:非递减顺序 排序的整数数组 nums

数组其实是有序的,只不过负数平方后可能成为最大数了。

那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。

此时可以考虑双指针法,i指向起始位置,j指向终止位置。

定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。

如果A[i] * A[i] < A[j] * A[j] 那么result[k--] = A[j] * A[j];

如果A[i] * A[i] >= A[j] * A[j] 那么result[k--] = A[i] * A[i];

如动画所示:

在Dev C++中编译

#include <bits/stdc++.h>
using namespace std;vector<int> sortedSquares(vector<int>& nums)
{int k=nums.size()-1;int length=nums.size();vector<int> square(nums.size(),0);for(int i=0, j=length-1;i<=j;)//注意这里的写法{if(nums[i]*nums[i]<=nums[j]*nums[j]){square[k--]=nums[j]*nums[j];j--;}else{square[k--]=nums[i]*nums[i];i++;}}return square;
}
int main()
{int n;	cin>>n;vector<int>nums;for(int i=0;i<n;i++){int ans;cin>>ans;nums.push_back(ans);}vector<int> nums2 = sortedSquares(nums); // 调用你的实现for(int i=0;i<nums2.size();i++){cout<<nums2[i]<<" ";}return 0;
}

在LeetCode中运行

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

此时的时间复杂度为O(n),相对于暴力排序的解法O(n + nlog n)还是提升不少的。 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 迪米特法则(LoD)
  • Python 爬取网页水务数据并实现智慧水务前端可视化
  • Linux的常用操作-02
  • 学懂C++(二十二):高级教程——深入理解 C++ 多线程基础理论和概念
  • RAG私域问答场景超级详细方案(第一期方案)[1]:工业级别构建私域问答(知识处理、知识召回排序、搜索问答模块)
  • 算法基础知识——核函数
  • #java学习笔记(面向对象)----(未完结)
  • 非范型ArrayList和泛型List<T>
  • Service服务在Android中的使用
  • UDP双向通信
  • SQL注入实例(sqli-labs/less-17)
  • CMake,Makefile,CMakeLists.txt的关系和作用
  • 10分钟学会Docker的安装和使用
  • 概述:Dubbo、Nacos、 Zookeeper 等分布式服务协调与治理等技术
  • WUP-CH34X ch34x系列芯片USB转串口通信uniapp插件使用说明
  • 收藏网友的 源程序下载网
  • @angular/forms 源码解析之双向绑定
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【翻译】babel对TC39装饰器草案的实现
  • Apache的80端口被占用以及访问时报错403
  • Shell编程
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 和 || 运算
  • 面试遇到的一些题
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 想写好前端,先练好内功
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 第二十章:异步和文件I/O.(二十三)
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #pragam once 和 #ifndef 预编译头
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • %@ page import=%的用法
  • (1)(1.9) MSP (version 4.2)
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C++哈希表01)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (web自动化测试+python)1
  • (第30天)二叉树阶段总结
  • (离散数学)逻辑连接词
  • (理论篇)httpmoudle和httphandler一览
  • (三)c52学习之旅-点亮LED灯
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • .Net Core 中间件与过滤器
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net 受管制代码
  • .NET 直连SAP HANA数据库
  • .NET6实现破解Modbus poll点表配置文件
  • .net对接阿里云CSB服务